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
前两列是integer
s,最后两列是string
s。我想将 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|
// +--------------------------------------------------------------------------+
我正在通过从本地文件加载来创建 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
前两列是integer
s,最后两列是string
s。我想将 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|
// +--------------------------------------------------------------------------+