为什么PySpark的filter函数运行报错,无法按orderStatus过滤数据?
问题原因
groupBy + agg 操作执行后,生成的新DataFrame仅保留了你分组用到的productName字段、以及聚合计算得到的max(orderItemSubTotal)字段,原始的orderStatus字段在聚合过程中已经被丢弃,所以后续的filter语句无法定位到该字段,才会抛出字段不存在的报错。
解决方案
根据你的实际业务需求,可以选择以下两种修改方式:
方案1:先过滤再聚合(绝大多数场景适用)
如果你的需求是统计状态为CLOSED的订单中,每个商品对应的最高订单子项金额,只需要调整操作顺序,先筛选出符合状态要求的行,再执行聚合操作即可,修改后代码如下:
df1 = all_in_all_df.filter(col("orderStatus") == "CLOSED") \ .groupBy("productName") \ .agg(F.max('orderItemSubTotal')) \ .show()
方案2:将orderStatus加入分组维度(特殊场景适用)
如果你的业务逻辑要求必须先做聚合,再按订单状态过滤,就需要把orderStatus字段纳入聚合的分组维度,保证聚合后的结果中保留该字段:
df1 = all_in_all_df.groupBy("productName", "orderStatus") \ .agg(F.max('orderItemSubTotal')) \ .filter(col("orderStatus") == "CLOSED") \ .show()
内容的提问来源于stack exchange,提问作者Kenan Arslanbay
相关产品推荐
相关产品推荐

