首页 > 解决方案 > spark date_format 在 2.4 版中显示 null

问题描述

我正在尝试转换日期格式。我在一列中有如下数据:

04-JUN-21 09.07.55.061067 PM

我正在尝试将其转换为以下格式:

2021-06-04 21:07:55

我正在尝试下面的代码来做到这一点:

val df = Seq("04-JUN-21 09.07.55.061067 PM", "05-JUN-21 09.07.55.061067 PM").toDF("UPLOADED_DATE")
df.select(date_format(to_timestamp($"UPLOADED_DATE","dd-MMM-yy hh.mm.ss.SSSSSS a"),"yyyy-MM-dd HH:mm:ss") as "UPLOADED_DATE").show
df.registerTempTable("tbl")
spark.sql("select date_format(to_timestamp(UPLOADED_DATE,'dd-MMM-yy hh.mm.ss.SSSSSS a'),'yyyy-MM-dd HH:mm:ss') as UPLOADED_DATE from tbl").show()

我在使用 spark 3.0.2 版本时得到了结果:

+-------------------+
|      UPLOADED_DATE|
+-------------------+
|2021-06-04 21:07:55|
|2021-06-05 21:07:55|
+-------------------+

但是在使用 spark 2.4.7 版本时为空:

+-------------+
|UPLOADED_DATE|
+-------------+
|         null|
|         null|
+-------------+

请让我知道在 spark 2.4 版本中是否有不同的方法。

标签: scalaapache-sparkapache-spark-sql

解决方案


这是一种解决方法。时间戳的毫秒部分似乎导致了问题,所以如果你无论如何都要丢弃它,你可以在调用之前将其删除to_timestamp

df.select(
    date_format(
        to_timestamp(
            regexp_replace($"UPLOADED_DATE", "\\.\\d{6}", ""),
            "dd-MMM-yy hh.mm.ss a"
        ),
        "yyyy-MM-dd HH:mm:ss"
    ) as "UPLOADED_DATE"
).show
+-------------------+
|      UPLOADED_DATE|
+-------------------+
|2021-06-04 21:07:55|
|2021-06-05 21:07:55|
+-------------------+

推荐阅读