首页 > 解决方案 > PySpark 根据排名创建新列

问题描述

我想根据排名列在 DataFrame 中添加一些新列

所以,我有这张桌子

店铺 价格
乔的 花冠 10000 1
乔的 HB20 5000 2
乔的 甲虫 1500 3
卡尔的 高尔夫球 7500 1
卡尔的 HB20 5500 2
卡尔的 欧帕拉 4500 3
卡尔的 蒙扎 2500 4

我想 groupBy 存储并创建三个新列,其中包含三辆最昂贵的汽车,如下所示:

店铺 1_most_exp_car 2_most_exp_car 3_most_exp_car
乔的 花冠 HB20 甲虫
卡尔的 高尔夫球 HB20 欧帕拉

我试图进行排序并制作一个这样的收集列表:

grouped_df.groupBy('Store').agg(F.collect_list("car")).show()

但它返回了一个无序数组

我是 PySpark 的新手,我不知道如何处理它

标签: pythonpysparkapache-spark-sql

解决方案


首先做一个过滤器,只保留每家商店最昂贵的汽车,然后做groupby.pivot

import pyspark.sql.functions as f

(df.filter(df.rank <= 3)
   .withColumn('col', f.expr('concat(rank, "_most_exp_car")'))
   .groupby('Store')
   .pivot('col')
   .agg(f.first(df.Car))
 ).show()

+------+--------------+--------------+--------------+
| Store|1_most_exp_car|2_most_exp_car|3_most_exp_car|
+------+--------------+--------------+--------------+
|Carl's|          Golf|          HB20|         Opala|
| Joe's|       Corolla|          HB20|        Beetle|
+------+--------------+--------------+--------------+

推荐阅读