PySpark中select已指定列仍提示无法解析actual_date是什么原因?
报错根本原因
- 执行
groupBy('general_id').agg(sum('payment').alias('payments_803_all'))步骤后,输出的DataFrame仅保留分组键general_id和本次聚合生成的payments_803_all两个字段。你之前select阶段保留的actual_date既没有作为分组键,也没有在groupBy阶段做聚合处理,因此该字段在groupBy执行完成后就已经从DataFrame中被移除。 - 后续调用
.agg(max('actual_date').alias('last_action_date'))时,输入的DataFrame已经不存在actual_date字段,因此触发字段找不到的报错。 - 额外注意:你当前代码的select阶段没有包含
payment_code字段,但后续where过滤逻辑用到了该字段,这部分也会触发同类字段找不到报错,需要同步调整。
修复方案
根据你的业务需求可选择对应调整方式:
场景1:需要统计每个general_id对应的总支付金额和最近业务日期
把actual_date的最大值聚合逻辑放到groupBy阶段的agg方法中即可,参考代码:
df = df_MAIN_TABLE.select( concat( lpad(col('id_1'), 3, '0'), lpad(col('id_2'), 3, '0'), lpad(col('id_3'), 7, '0') ).alias('general_id'), 'payment', 'actual_date', 'payment_code' # 新增保留payment_code供where过滤 )\ .where((col('payment_code')==803) & (col('actual_date').between(date_from1,end_of_month)))\ .groupBy('general_id').agg( sum('payment').alias('payments_803_all'), max('actual_date').alias('last_action_date') # 把actual_date的聚合移到groupBy阶段 )\ .withColumn('validity_date', lit(end_of_month))
场景2:需要统计全量数据的全局最大业务日期
可以提前计算全局最大actual_date,再和分组聚合后的结果关联,或者直接用窗口函数实现。
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

