J'essaie de convertir une colonne au format Chaîne au format Date à l'aide de la fonction to_date
mais en renvoyant des valeurs Null.
df.createOrReplaceTempView("incidents")
spark.sql("select Date from incidents").show()
+----------+
| Date|
+----------+
|08/26/2016|
|08/26/2016|
|08/26/2016|
|06/14/2016|
spark.sql("select to_date(Date) from incidents").show()
+---------------------------+
|to_date(CAST(Date AS DATE))|
+---------------------------+
| null|
| null|
| null|
| null|
La colonne Date est au format String:
|-- Date: string (nullable = true)
Utilisez to_date
avec Java SimpleDateFormat
.
TO_DATE(CAST(UNIX_TIMESTAMP(date, 'MM/dd/yyyy') AS TIMESTAMP))
Exemple:
spark.sql("""
SELECT TO_DATE(CAST(UNIX_TIMESTAMP('08/26/2016', 'MM/dd/yyyy') AS TIMESTAMP)) AS newdate"""
).show()
+----------+
| dt|
+----------+
|2016-08-26|
+----------+
J'ai résolu le même problème sans la table/vue temporaire et avec les fonctions dataframe.
Bien sûr, j’ai constaté qu’un seul format fonctionnait avec cette solution: yyyy-MM-DD
.
Par exemple:
val df = sc.parallelize(Seq("2016-08-26")).toDF("Id")
val df2 = df.withColumn("Timestamp", (col("Id").cast("timestamp")))
val df3 = df2.withColumn("Date", (col("Id").cast("date")))
df3.printSchema
root
|-- Id: string (nullable = true)
|-- Timestamp: timestamp (nullable = true)
|-- Date: date (nullable = true)
df3.show
+----------+--------------------+----------+
| Id| Timestamp| Date|
+----------+--------------------+----------+
|2016-08-26|2016-08-26 00:00:...|2016-08-26|
+----------+--------------------+----------+
L'horodatage du cours a 00:00:00.0
comme valeur de temps.
Puisque votre objectif principal était de convertir le type d'une colonne dans un DataFrame de String à Timestamp, je pense que cette approche serait préférable.
import org.Apache.spark.sql.functions.{to_date, to_timestamp}
val modifiedDF = DF.withColumn("Date", to_date($"Date", "MM/dd/yyyy"))
Vous pouvez également utiliser to_timestamp
(je pense que cela est disponible à partir de Spark 2.x) si vous avez besoin d'un horodatage à grain fin.
Vous pouvez également passer le format de date
df.withColumn("Date",to_date(unix_timestamp(df.col("your_date_column"), "your_date_format").cast("timestamp")))
Par exemple
import org.Apache.spark.sql.functions._
val df = sc.parallelize(Seq("06 Jul 2018")).toDF("dateCol")
df.withColumn("Date",to_date(unix_timestamp(df.col("dateCol"), "dd MMM yyyy").cast("timestamp")))
dateID est la colonne int contient la date au format Int
spark.sql("SELECT from_unixtime(unix_timestamp(cast(dateid as varchar(10)), 'yyyymmdd'), 'yyyy-mm-dd') from XYZ").show(50, false)
La solution proposée ci-dessus par Sai Kiriti Badam a fonctionné pour moi.
J'utilise Azure Databricks pour lire les données capturées à partir d'un EventHub. Ceci contient une colonne de chaîne nommée EnqueuedTimeUtc au format suivant ...
12/7/2018 12:54:13 PM
J'utilise un cahier Python et j'ai utilisé ce qui suit ...
import pyspark.sql.functions as func
sports_messages = sports_df.withColumn("EnqueuedTimestamp", func.to_timestamp("EnqueuedTimeUtc", "MM/dd/yyyy hh:mm:ss aaa"))
... pour créer une nouvelle colonne EnqueuedTimestamp de type "timestamp" avec des données au format suivant ...
2018-12-07 12:54:13