Spark加载timestamp类型数据时忽略原时区采用会话时区是否为预期行为?
结论
你观察到的是Spark的预期正常行为,不属于Bug。
底层逻辑说明
- Spark SQL的
TIMESTAMP类型本身不存储时区信息,底层仅存储对应时间点的Unix时间戳(即1970-01-01 00:00:00 UTC到该时间点的微秒数)。 - 你传入的带UTC时区的
2020-01-01 00:00:00+00:00会被Spark先转换为对应的Unix时间戳存储,后续所有的展示、字符串转换操作,都会默认使用spark.sql.session.timeZone配置的时区来做格式化。你的例子里配置的是莫斯科时区(2020年莫斯科时区为UTC+3),因此格式化后输出的就是2020-01-01 03:00:00。 - 时间点本身没有发生偏移,只是展示用的时区不同:你可以在创建完DF后追加一行配置
spark.conf.set("spark.sql.session.timeZone", "UTC"),再调用df.show()或者collect()打印,输出的时间就会和你输入的原始时间一致。
业务兼容方案
如果需要保留原始时区的展示值,可选择两种常用方案:
- 额外新增一个字符串字段,存储原始带时区的时间字符串
- 额外新增一个字符串字段存储原始时区标识,需要格式化输出时,通过
from_utc_timestamp等时间函数结合时区字段转换为对应时区的展示值。
内容的提问来源于stack exchange,提问作者towelenee
相关产品推荐
相关产品推荐

