【发布时间】:2018-06-20 02:52:51
【问题描述】:
我有一个pyspark 数据框。在这个数据框中,我有一个名为test_time 的列,它的数据类型为string
>>> df
DataFrame[test_time: string]
df.show()
+-------------------+
| test_time|
+-------------------+
|2017-03-12 02:41:06|
|2017-03-12 02:43:52|
|2017-03-12 02:56:32|
|2017-03-12 03:16:23|
|2017-03-12 03:17:15|
|2017-03-12 03:22:19|
|2017-03-12 03:52:19|
|2017-03-12 04:03:21|
+-------------------+
现在我想将此test_time 列从string 转换为timestamp
我已经完成了如下操作
from pyspark.sql import functions as F
df1 = df.withColumn('convert_test', F.unix_timestamp('test_time', "yyyy-MM-dd hh:mm:ss").cast('timestamp'))
>>> df1
DataFrame[test_time: string, convert_test: timestamp]
df1.show()
+-------------------+--------------------+
| test_time| convert_test|
+-------------------+--------------------+
|2017-03-12 02:41:06|2017-03-12 03:41:...|
|2017-03-12 02:43:52|2017-03-12 03:43:...|
|2017-03-12 02:56:32|2017-03-12 03:56:...|
|2017-03-12 03:16:23|2017-03-12 03:16:...|
|2017-03-12 03:17:15|2017-03-12 03:17:...|
|2017-03-12 03:22:19|2017-03-12 03:22:...|
|2017-03-12 03:52:19|2017-03-12 03:52:...|
|2017-03-12 04:03:21|2017-03-12 04:03:...|
+-------------------+--------------------+
如您所见,Hours 与行 1-3 不同。
FYI 我的时区是PST,1-3 行是day light savings 时间期间的计时。
我怎样才能进行正确的转换。
【问题讨论】:
-
您的数据看起来有问题。如果 timeone 是 PST,那么应该有更正,然后在 02:00:00 时钟应该向前移动到 03:00:00 并且你永远不应该得到
02:41:06。在这种情况下,转换本地 TZ -> UTC -> 本地 TZ 听起来像是未定义的东西,但我绝对不希望看到2017-03-12 02:41:06。虽然我不是时区专家...... :) -
@user6910411 数据来自
mysql表,我将timestamp列为string。数据正确 -
我的意思是 - 您在不考虑夏令时的情况下导出数据,但在配置为更正夏令时的系统中读取数据。如果您的时钟设置为
America/Los_Angeles(似乎等同于您当前的设置),您首先不会体验02:41。但就像说的那样,我可能错了。
标签: sql timezone apache-spark-sql dst timestamp-with-timezone