apache-spark - 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|
+-------+-------------------+
你能告诉我这是否是预期的行为吗?
解决方案
好吧,您在使用 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|
+-------+-------------------+
推荐阅读
- android - return@methodName - 该语法的含义?
- google-sheets - Google 表格 - 拆分数据
- php - 如何在 html 文件中创建变量范围
- angular - npm run build:ssr 抛出了几个关于nestjs的警告
- c++ - C++ 中的可迭代指定初始化器替代方案
- c# - 如何从项目内部获取某些内容到目录?(C#)
- jquery - ajax 分页在 laravel 中不起作用
- php - 将作曲家 1 和 2 保持在同一台机器上
- javascript - 未处理的拒绝 (TypeError):在已撤销的代理上尝试非法操作
- java - @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss") 不工作