Spark 无法解析时间戳字段

Spark unable to parse timestamp fileds

我正在通过从本地文件加载来创建 Spark (2.2.0) DataFrame。文件加载按预期发生,我得到以下 DF。

scala> df.show(4, false)
+--------+------------------+------------+----------------------------+
|userId  |legacyProductId   |optInFlag   |transaction_date            |
+--------+------------------+------------+----------------------------+
|71844441|805934            |null        |Sat Oct 15 23:35:22 UTC 2005|
|71844441|714837            |null        |Sat Apr 09 10:04:30 UTC 2005|
|71844441|732860            |null        |Sat Mar 19 17:30:26 UTC 2005|
|71844441|1170951           |null        |Sat Mar 19 17:30:26 UTC 2005|
+--------+------------------+------------+----------------------------+
only showing top 4 rows

前两列是integers,最后两列是strings。我想将 transaction_date 列转换为 unix 时间戳。我做了以下。

val newdf = df.select($"userId", $"legacyProductId", $"OptInFlag", unix_timestamp($"transaction_date", "EEE MMM dd hh:mm:ss z yyyy"))

有了这个,我确实得到了最后一列的毫秒数。但是,并非所有行都发生转换,如下所示。

scala> newdf.show(4, false)
+--------+------------------+------------+------------------------------------------------------------+
|userId  |legacyProductId   |OptInFlag   |unix_timestamp(transaction_date, EEE MMM dd hh:mm:ss z yyyy)|
+--------+------------------+------------+------------------------------------------------------------+
|71844441|805934            |null        |null                                                        |
|71844441|714837            |null        |1113041070                                                  |
|71844441|732860            |null        |null                                                        |
|71844441|1170951           |null        |null                                                        |
+--------+------------------+------------+------------------------------------------------------------+
only showing top 4 rows

只有第二行时间戳转换成功。其余失败并设置为空。

我是否正确指定了格式字符串 EEE MMM d hh:mm:ss z yyyy?我该如何调试?

那是因为hh is

Hour in am/pm (1-12)

你应该使用 HH:

Hour in day (0-23)

喜欢

scala> spark.sql("SELECT unix_timestamp('Sat Mar 19 17:30:26 UTC 2005', 'EEE MMM dd HH:mm:ss zzz yyyy')").show
// +--------------------------------------------------------------------------+
// |unix_timestamp(Sat Mar 19 17:30:26 UTC 2005, EEE MMM dd HH:mm:ss zzz yyyy)|
// +--------------------------------------------------------------------------+
// |                                                                1111253426|
// +--------------------------------------------------------------------------+