PySpark字符串转日期报错HOUR_OF_DAY: 0 -> 1如何解决?
问题原因
这个报错是夏令时时区转换冲突导致的:你使用的unix_timestamp函数默认按Spark会话的本地时区解析时间字符串,部分实行过夏令时的时区(比如中国1986-1991年执行夏令时期间)存在日期切换当天缺失特定小时段的情况,比如切换日凌晨2点拨快到3点,当天不存在0-2点的时间,转换时就会抛出该异常。
解决方案
方案1:直接使用to_date简化转换(推荐)
PySpark的to_date原生支持直接指定字符串格式解析,不需要中转时间戳,从根源避免时区转换问题:
final_df = final_df.withColumn('dob', to_date(col('DateOfBirth'), 'yyyy-MM-dd'))
方案2:指定UTC时区解析(兼容原有写法)
如果需要保留时间戳转换的逻辑,可以指定无夏令时的UTC作为解析时区,有两种实现方式:
- 单次转换指定时区:
final_df = final_df.withColumn('dob', to_date(unix_timestamp(col('DateOfBirth'),'yyyy-MM-dd').cast("timestamp"), "UTC"))
- 全局设置Spark会话时区为UTC:
spark.conf.set("spark.sql.session.timeZone", "UTC") # 后续执行原有代码即可正常运行 final_df = final_df.withColumn('dob',to_date(unix_timestamp(col('DateOfBirth'),'yyyy-MM-dd').cast("timestamp")))
内容的提问来源于stack exchange,提问作者Shivam Gupta
相关产品推荐
相关产品推荐

