PySpark DataFrame日期修复:将早于1900年的时间戳设为最小值或空值
PySpark 原生函数实现异常时间戳修正
针对timestamp类型列RECEIPTDATEREQUESTED中小与1900-01-01的异常值修正需求,无需自定义UDF,直接使用Spark内置的when条件函数即可实现,性能远高于Python UDF,代码更简洁。
方案1:小于阈值的时间统一设置为1900-01-01 00:00:00
from pyspark.sql import functions as F # 定义合法时间的最小阈值 min_valid_ts = F.to_timestamp(F.lit("1900-01-01 00:00:00")) # 替换异常值 bdf = olddf.withColumn( "RECEIPTDATEREQUESTED", F.when(F.col("RECEIPTDATEREQUESTED") < min_valid_ts, min_valid_ts) .otherwise(F.col("RECEIPTDATEREQUESTED")) )
方案2:小于阈值的时间统一设置为null
只需要修改when的返回值即可:
from pyspark.sql import functions as F min_valid_ts = F.to_timestamp(F.lit("1900-01-01 00:00:00")) bdf = olddf.withColumn( "RECEIPTDATEREQUESTED", F.when(F.col("RECEIPTDATEREQUESTED") >= min_valid_ts, F.col("RECEIPTDATEREQUESTED")) .otherwise(F.lit(None).cast("timestamp")) )
方案优势
- 完全基于Spark原生函数执行,全程在JVM进程内计算,避免Python UDF的进程通信开销,大数据量下性能提升非常显著
- 无需自定义函数、注册UDF,代码更简洁易维护
- 针对已定义为timestamp类型的列,自动兼容类型校验,无需额外处理Python层面的异常
内容的提问来源于stack exchange,提问作者roguecode
相关产品推荐
相关产品推荐

