我的数据框如下:
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]
答案 0 :(得分:20)
添加排名:
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进行测试。
答案 1 :(得分:1)
windowSpec = Window.partitionBy("col1").orderBy("col2")
ranked = demand.withColumn("col_rank", row_number().over(windowSpec))
ranked.show(1000)
[![示例] [1]] [1]