我有一个看起来像这样的数据框:
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]
user7337271.. 24
添加排名:
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进行测试.
添加排名:
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进行测试.