PySpark中使用partition by子句按双列分区取首行时报错求助
问题解决:PySpark按多列分区计算Row_Number并筛选首行
- 错误原因:
Window.partitionBy()的参数格式错误,你把两个列名合并成了单个字符串,PySpark会将其当作单个列名查找,因找不到对应列导致报错。 - 正确实现代码:将多个分区列作为独立参数传入
partitionBy(),同时完成行号计算与首行筛选,完整代码如下:
from pyspark.sql.window import Window from pyspark.sql.functions import row_number # 正确定义窗口:分区列分开传参,按销售额降序排序 windowSpec = Window.partitionBy("category_name", "SubCategoryName").orderBy("total_sales_360", ascending=False) # 添加行号列并筛选行号为1的数据 result_df = df3.withColumn("row_num", row_number().over(windowSpec)).filter("row_num = 1") # 查看最终结果 result_df.show(truncate=False)
- 补充说明:
orderBy中ascending=False和直接写total_sales_360 desc功能等价,前者写法更直观- 筛选行号时,也可以用
filter(col("row_num") == 1),但需要提前导入from pyspark.sql.functions import col
内容的提问来源于stack exchange,提问作者Random guy
相关产品推荐
相关产品推荐

