在Dataframes中将日期从String转换为Date格式

Ish*_*mar 35 apache-spark apache-spark-sql

我试图使用to_date函数将一个String格式的列转换为Date格式,但是它返回的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|
Run Code Online (Sandbox Code Playgroud)

Date列采用String格式:

 |-- Date: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

小智 38

to_date与Java一起使用SimpleDateFormat.

TO_DATE(CAST(UNIX_TIMESTAMP(date, 'MM/dd/yyyy') AS TIMESTAMP))
Run Code Online (Sandbox Code Playgroud)

例:

spark.sql("""
  SELECT TO_DATE(CAST(UNIX_TIMESTAMP('08/26/2016', 'MM/dd/yyyy') AS TIMESTAMP)) AS newdate"""
).show()

+----------+
|        dt|
+----------+
|2016-08-26|
+----------+
Run Code Online (Sandbox Code Playgroud)

  • 我发现`to_date(my_string_column,'yyyyMMdd')AS my_date_column`在`Spark 2.3.2`中可以正常工作;当然,您可以用自己的*日期格式*代替`yyyyMMdd` (4认同)

V. *_*mma 31

我在没有临时表/视图和数据帧功能的情况下解决了同样的问题.

当然,我发现只有一种格式适用于这种解决方案yyyy-MM-DD.

例如:

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|
+----------+--------------------+----------+
Run Code Online (Sandbox Code Playgroud)

时间戳当然00:00:00.0是一个时间值.


Sai*_*dam 18

由于您的主要目标是将DataFrame中的列类型从String转换为Timestamp,我认为这种方法会更好.

import org.apache.spark.sql.functions.{to_date, to_timestamp}
val modifiedDF = DF.withColumn("Date", to_date($"Date", "MM/dd/yyyy"))
Run Code Online (Sandbox Code Playgroud)

to_timestamp如果你需要细粒度的时间戳,你也可以使用(我认为这可以从Spark 2.x获得).

  • 这两个功能仅在2.2版本之后可用. (4认同)

Cur*_*ycu 7

你也可以这样查询...!

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

在此输入图像描述


Ami*_*bey 5

您还可以传递日期格式

df.withColumn("Date",to_date(unix_timestamp(df.col("your_date_column"), "your_date_format").cast("timestamp")))
Run Code Online (Sandbox Code Playgroud)

例如

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")))
Run Code Online (Sandbox Code Playgroud)