web-dev-qa-db-fra.com

Convertir la date du format String en Date dans les Dataframes

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)
24
Ishan Kumar

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|
+----------+
28
user6022341

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.

25
V. Samma

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.

12
Sai Kiriti Badam

vous pouvez aussi faire cette requête ...!

sqlContext.sql("""
select from_unixtime(unix_timestamp('08/26/2016', 'MM/dd/yyyy'), 'yyyy:MM:dd') as new_format
""").show()

 enter image description here

5
Curycu

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")))
1
Amit Dubey

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)
1
Rajiv Singh

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

0
Simon Peacock