Apache spark 使用pyspark对spark数据帧进行分组、排序和聚合

Apache spark 使用pyspark对spark数据帧进行分组、排序和聚合,apache-spark,pyspark,spark-dataframe,Apache Spark,Pyspark,Spark Dataframe,我有一个数据框,看起来像: 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 ---------------

我有一个数据框,看起来像:

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)

[![示例][1]][1]

最喜欢的按钮在哪里?