我有一个包含以下两列的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。
有什么建议可以缩小这个问题吗?
答案 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