python - PySpark 根据排名创建新列

标签 python pyspark apache-spark-sql

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

所以,我有这张 table

<表类=“s-表”> <标题> 商店 汽车 价格 排名 <正文> 乔的 卡罗拉 10000 1 乔的 HB20 5000 2 乔的 甲虫 1500 3 卡尔的 高尔夫 7500 1 卡尔的 HB20 5500 2 卡尔的 奥帕拉 4500 3 卡尔的 蒙扎 2500 4

我想对三辆最昂贵的汽车进行分组存储并创建三个新列,如下所示:

<表类=“s-表”> <标题> 商店 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 的新手,我不知道如何处理它

最佳答案

首先执行过滤器,仅保留每个商店最昂贵的汽车,然后执行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|
+------+--------------+--------------+--------------+

关于python - PySpark 根据排名创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68479495/

相关文章:

python - AWS CLI 中 list-objects-v2 --query 命令的 boto3 版本

pyspark - spark join 引发 "Detected cartesian product for INNER join"

python - 在几个不同的值上 SparkreduceByKey

python - 使用 Pyspark 和 Hive 显示来自特定数据库的表

Pyspark,如何使用udf计算泊松分布?

apache-spark - 依赖于公共(public)列的两个数据帧之间的交叉连接

java - 如何在 Java 或 Python 中使用文件系统缓存?

python - swig 无法找到 openssl conf

scala - 在 spark scala 中使用窗口函数删除重复记录

python - python中分类变量的knn插补