PySpark日期过滤函数报错:如何基于输入日期筛选一年数据?
解决PySpark日期筛选报错“Column 'xxx' does not exist”的问题
问题原因
你代码里的to_date(st_date)把输入的字符串日期当成了列名,而非常量值。PySpark的to_date函数如果接收字符串参数,会默认解析为DataFrame中的列名,所以才会报错说找不到对应列。同时add_months返回的是Column类型,但这里需要的是基于输入日期计算的常量日期列,而非动态列。
解决方案
需要用lit()函数将输入的字符串日期包装成常量列,再进行日期转换和计算,这样PySpark就会把它当作固定值处理,而不是列名。
修正后的代码
from pyspark.sql.functions import to_date, add_months, lit def one_year_data(df, st_date): # 将输入的字符串日期转为常量日期列 start_date = to_date(lit(st_date)) # 计算12个月后的结束日期(同样是常量列) end_date = add_months(start_date, 12) # 用常量日期列筛选数据 df_filtered = df.filter((df.date >= start_date) & (df.date < end_date)) return df_filtered
代码说明
lit(st_date):把输入的字符串st_date转换成PySpark的常量列,确保后续日期函数处理的是固定值,而非列名。to_date(lit(st_date)):将常量字符串列转为日期类型列,匹配DataFrame中date列的类型。- 筛选条件
df.date >= start_date & df.date < end_date:确保只保留从输入日期开始,到12个月内的记录(不包含结束日期当天),符合输入“2017-01-01”返回2017年全年记录的需求。
内容的提问来源于stack exchange,提问作者easyown
相关产品推荐
相关产品推荐

