You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark中to_timestamp/unix_timestamp解析夏令时字符串转时间戳失败问题

问题根因

你遇到的夏令时时间解析失败是因为Europe/London时区每年3月最后一个周日会执行夏令时跳变:凌晨1点会直接跳转到凌晨2点,这段跳变区间的时间在伦敦本地时区本身是非法不存在的,Spark 2.4默认的时间解析策略遇到这类非法时间会直接返回null。

解决方案

方案1:修改时间解析策略(推荐)

Spark 2.4支持通过spark.sql.legacy.timeParserPolicy参数调整时间解析逻辑,设置为LEGACY后,遇到夏令时非法时间会自动调整到最近的合法时间,不会返回null,且全程不会修改你设置的Europe/London会话时区:

# 调整时间解析策略
spark_session.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")
# 执行原有转换逻辑即可正常解析
df2 = df1.withColumn("rec_date", to_timestamp("rec_dt","yyyy-MM-dd-HH.mm.ss"))

方案2:自定义异常时间处理规则

如果你需要自定义非法时间的处理逻辑(比如标记异常、手动偏移时间),可以通过条件判断单独处理解析失败的null值:

from pyspark.sql.functions import col, to_timestamp, when, expr

# 先执行基础解析
df2 = df1.withColumn("rec_date_raw", to_timestamp("rec_dt","yyyy-MM-dd-HH.mm.ss"))
# 对解析失败的夏令时异常时间做自定义处理,示例为偏移到次日0点,可按需修改逻辑
df2 = df2.withColumn("rec_date", 
    when(col("rec_date_raw").isNull(), 
         to_timestamp(expr("date_add(to_timestamp(substring(rec_dt, 1, 10), 'yyyy-MM-dd'), 1)"), "yyyy-MM-dd")
    ).otherwise(col("rec_date_raw"))
).drop("rec_date_raw")

输出时区确认

你已经配置了spark.sql.session.timeZone = 'Europe/London',只要写出数据时不额外指定时区参数,最终输出的时间就会按伦敦时区存储,不会转换为UTC。

内容的提问来源于stack exchange,提问作者Soumyajit Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:24:02