PySpark Timestamp转Date时替换无效日期异常的解决方法
问题修复方案
错误原因分析
- 判断条件笔误:原代码中判断的是
0001-01-01,但实际要处理的无效日期是0000-01-01,导致无法匹配目标值。 - 类型不匹配:
StartDate是Timestamp类型,直接与字符串比较会触发隐式转换,加上Spark对0000-01-01这类超出支持范围的日期处理异常,最终得到错误的0000-12-31。 - 日期范围限制:Spark的Date类型支持的合法范围是
0001-01-01至9999-12-31,0000-01-01属于无效日期,直接转换会出现偏移错误。
修复后的代码
方案一:转Date后判断替换
from pyspark.sql import functions as F df = tableA.withColumn( 'StartDate', F.when( # 先将Timestamp转为Date,结合isNull覆盖无效日期转null的场景 F.to_date(F.col('StartDate')).isNull() | (F.to_date(F.col('StartDate')) == F.to_date(F.lit('0000-01-01'))), F.to_date(F.lit('1900-01-01')) ).otherwise( F.to_date(F.col('StartDate')) ) )
方案二:转字符串格式后匹配
from pyspark.sql import functions as F df = tableA.withColumn( 'StartDate', F.to_date( F.when( # 提取Timestamp的日期字符串,精准匹配无效值 F.date_format(F.col('StartDate'), 'yyyy-MM-dd') == '0000-01-01', F.lit('1900-01-01') ).otherwise( F.date_format(F.col('StartDate'), 'yyyy-MM-dd') ) ) )
说明
- 方案一通过
to_date转换后结合isNull判断,能覆盖0000-01-01转Date时变为null的场景,兼容性更强。 - 方案二直接提取日期字符串进行匹配,避免了类型转换带来的异常,逻辑更直观。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

