spark时间戳转换失败

时间:2018-06-11 11:41:39

标签: apache-spark apache-spark-sql

我有一个包含以下两列的CSV数据集:

scala> df2.select(col("_c1"), col("_c2")).show
+-------------------+-------------------+
|                _c1|                _c2|
+-------------------+-------------------+
|2018-01-01 00:00:00|2018-03-11 01:59:59|
|2015-10-24 21:00:00|2015-11-01 01:59:59|
|2017-03-12 02:00:00|2017-03-25 19:59:59|
|2015-10-24 21:00:00|2015-11-01 01:59:59|
|2017-03-12 02:00:00|2017-03-25 19:59:59|
+-------------------+-------------------+

我试图将列转换为TimestampType:

df2.select(unix_timestamp(col("_c1"), "yyyy-MM-dd HH:mm:ss").cast(TimestampType).as("c1"), unix_timestamp(col("_c2"), "yyyy-MM-dd HH:mm:ss").cast(TimestampType).as("c2")).show
+-------------------+-------------------+
|                 c1|                 c2|
+-------------------+-------------------+
|2018-01-01 00:00:00|2018-03-11 01:59:59|
|2015-10-24 21:00:00|2015-11-01 01:59:59|
|               null|2017-03-25 19:59:59|
|2015-10-24 21:00:00|2015-11-01 01:59:59|
|               null|2017-03-25 19:59:59|
+-------------------+-------------------+

如您所见,我在转换过程中遇到空值。 环境信息: - 当地时区是CDT。 - Spark版本是2.2.0

我没有得到空的唯一情况是我将时区设置为UTC。

有什么建议可以缩小这个问题吗?

1 个答案:

答案 0 :(得分:1)

这可能不是完整的答案,而是对空值的解释。

这正如预期的那样工作"当时区设置为CDT时,会观察到null" s。请注意,CDT时区遵守夏令时,这意味着" 当地时间在当地标准时间02:00变为3月第二个星期日当地日光时间03:00 "

在你的情况下" 2017-03-12 02:00:00"恰好是3月的第二个星期日,因此如果时区设置为CDT,时间本身就是无效的。如果时间介于" 2017-03-12 02:00:00"到" 2017-03-12 02:59:59"

参考:1] https://en.wikipedia.org/wiki/Central_Time_Zone

2] Spark时间戳行为:https://gist.github.com/squito/f348508ca7903ec2e1a64f4233e7aa70