首页 > 解决方案 > Spark 忽略时间戳的时区

问题描述

我试图加载到火花数据帧,但似乎它忽略了时间戳的时区,而是使用火花时区。这是运行它的代码。

from pyspark.sql import SparkSession, Row
from datetime import datetime
import pytz
import os
spark = SparkSession.builder.getOrCreate()
spark.conf.set("spark.sql.session.timeZone", "Europe/Moscow")
df = spark.createDataFrame([
       Row(user_id = 'user_id', time=pytz.timezone("UTC").localize(datetime.combine(datetime(2020, 1, 1), datetime.min.time())))
    ])
for row in df.collect():
    print(row['time'])
    print(pytz.timezone("UTC").localize(datetime.combine(datetime(2020, 1, 1), datetime.min.time())))
df.show()

这是这种情况下的输出

2020-01-01 03:00:00                                                             
2020-01-01 00:00:00+00:00
+-------+-------------------+
|user_id|               time|
+-------+-------------------+
|user_id|2020-01-01 03:00:00|
+-------+-------------------+

你能告诉我这是否是预期的行为吗?

标签: apache-sparkpyspark

解决方案


好吧,您在使用 pytz 模块时将时区指定为 UTC,该模块为您提供输出为2020-01-01 00:00:00+00:00. 但是您在 spark 时区配置中将时区指定为 Europe/Moscow,因此您将获得2020-01-01 03:00:00(UTC+3)。

如果您为 spark config 指定时区为 UTC,那么您将获得与从 pytz 模块获得的相同答案。

>>> spark.conf.set("spark.sql.session.timeZone", "UTC")
>>> df.show()
+-------+-------------------+
|user_id|               time|
+-------+-------------------+
|user_id|2020-01-01 00:00:00|
+-------+-------------------+

推荐阅读