PySpark修改日期列日值为23日时change_day导入报错解决
问题原因
pyspark.sql.functions 模块不存在内置的change_day方法,直接调用会触发导入报错。你的业务需求本质是保留原日期列的年、月维度值,将日维度固定替换为23,不需要依赖不存在的change_day方法,用PySpark原生日期函数即可实现。
实现方案
方案1:推荐通用方案(全版本兼容,逻辑直观)
通过year、month函数提取原日期的年、月值,搭配make_date直接拼接年、月、固定日23生成目标日期,不会出现跨月、跨年偏移问题:
import pyspark.sql.functions as sf jsonDF2 = jsonDF2.withColumn( "periodEndDate", sf.make_date( sf.year("periodDate"), sf.month("periodDate"), sf.lit(23) ) )
如果你的periodDate列是字符串类型而非日期类型,先转换为日期类型再做拼接即可:
# 替换to_date的第二个参数为你实际的日期格式,例如yyyy/MM/dd、yyyyMMdd等 jsonDF2 = jsonDF2.withColumn( "periodEndDate", sf.make_date( sf.year(sf.to_date("periodDate", "yyyy-MM-dd")), sf.month(sf.to_date("periodDate", "yyyy-MM-dd")), sf.lit(23) ) )
方案2:偏移计算方案(无make_date的低版本PySpark适用)
先将原日期截断到当月第一天,再加22天得到当月23日,不需要拆分年、月字段:
import pyspark.sql.functions as sf jsonDF2 = jsonDF2.withColumn( "periodEndDate", sf.date_trunc("month", "periodDate").cast("date") + sf.expr("interval 22 days") )
校验说明
两种方案生成的periodEndDate均为日期类型,无论原periodDate存储的是当月哪一天(包括你提到的每月最后一天),输出结果都是对应月份的23日,完全匹配业务规则。
内容的提问来源于stack exchange,提问作者Lynchie
相关产品推荐
相关产品推荐

