我已将spark会话设置为使用utc时区,但当我使用utc时区时 df.toPandas()
,有时转换不正确。
Pypark shell中的最小复制器:
import pyspark.sql.functions as F
import pyspark.sql.types as T
spark.conf.set('spark.sql.session.timeZone', 'UTC')
df = spark.createDataFrame(["2019-10-26 00:15:00",
"2019-10-27 00:15:00",
"2019-10-27 01:15:00"], T.StringType())
df = df.select(F.col('value').cast('timestamp'))
pdf = df.toPandas()
df.show()
pdf.head()
哪些输出
>>> df.show()
+-------------------+
| value|
+-------------------+
|2019-10-26 00:15:00|
|2019-10-27 00:15:00| <- this is different...
|2019-10-27 01:15:00|
+-------------------+
>>> pdf.head()
value
0 2019-10-26 00:15:00
1 2019-10-27 01:15:00 <- from this
2 2019-10-27 01:15:00
我怀疑问题的根源是, df.toPandas()
电话 df.collect()
(https://github.com/apache/spark/blob/master/python/pyspark/sql/pandas/conversion.py#l133),它返回本地机器时区(欧洲/伦敦)中的python datetime对象。
>>> df.collect()
[Row(value=datetime.datetime(2019, 10, 26, 1, 15)),
Row(value=datetime.datetime(2019, 10, 27, 1, 15)),
Row(value=datetime.datetime(2019, 10, 27, 1, 15, fold=1))]
当spark试图将其转换回spark会话时区时,它无法正确处理该时区。对如何处理这个问题有什么建议吗?
暂无答案!
目前还没有任何答案,快来回答吧!