PySpark带时区时间戳字符串转timestamp时值偏移的解决方法
时间值偏移原因
你遇到的小时数变化是Spark会话时区和输入字符串时区不匹配导致的:
- 输入的时间字符串末尾带
+00:00,标识该时间属于UTC(0时区) - Spark默认会采用操作系统本地时区作为会话时区,你当前环境的会话时区为UTC-7,所以UTC时间15点会被转换为本地时区的8点
- 调用
show()或者cast('string')输出时,Spark也会默认用会话时区格式化时间,最终就出现了小时偏移的展示结果
解决方法
有两种常用方案可以避免时间值变化:
方案1:全局修改Spark会话时区为UTC
在创建SparkSession后、处理数据前添加以下配置,让整个会话的时间解析、存储、展示都采用UTC时区,和输入时区保持一致:
spark.conf.set("spark.sql.session.timeZone", "UTC")
添加该配置后再运行你原有的代码,输出的时间就会和输入的2020-04-06 15:06:16完全一致。
方案2:显式指定时区处理,不修改全局配置
如果不适合修改全局会话配置,可以在解析和输出时间时显式指定时区:
from pyspark.sql.functions import to_timestamp, date_format # 解析时间时指定输入为UTC时区 df = df.withColumn("timestamp", to_timestamp("input_timestamp")) # 输出时指定用UTC时区格式化,避免本地时区影响展示结果 df.withColumn('timestamp_string', date_format('timestamp', "yyyy-MM-dd HH:mm:ss").withTimeZone("UTC")) \ .show(truncate=False)
内容的提问来源于stack exchange,提问作者Rasika
相关产品推荐
相关产品推荐

