分组依据,使用 pyspark 对火花数据帧进行排名和聚合



我有一个数据帧,如下所示:

A     B    C
---------------
A1    B1   0.8
A1    B2   0.55
A1    B3   0.43
A2    B1   0.7
A2    B2   0.5
A2    B3   0.5
A3    B1   0.2
A3    B2   0.3
A3    B3   0.4

如何将"C"列转换为每列 A 的相对排名(更高的分数->更好的排名)?预期输出:

A     B    Rank
---------------
A1    B1   1
A1    B2   2
A1    B3   3
A2    B1   1
A2    B2   2
A2    B3   2
A3    B1   3
A3    B2   2
A3    B3   1

我想要达到的最终状态是聚合 B 列并存储每个 A 的排名:

例:

B    Ranks
B1   [1,1,3]
B2   [2,2,2]
B3   [3,2,1]

添加排名:

from pyspark.sql.functions import *
from pyspark.sql.window import Window
ranked =  df.withColumn(
  "rank", dense_rank().over(Window.partitionBy("A").orderBy(desc("C"))))

分组依据:

grouped = ranked.groupBy("B").agg(collect_list(struct("A", "rank")).alias("tmp"))

排序和选择:

grouped.select("B", sort_array("tmp")["rank"].alias("ranks"))

使用 Spark 2.1.0 进行测试。

windowSpec = Window.partitionBy("col1").orderBy("col2")
ranked = demand.withColumn("col_rank", row_number().over(windowSpec))
ranked.show(1000)

相关内容

  • 没有找到相关文章

最新更新