2017-01-15 45 views
2

我有一個數據幀,看起來像:GROUP BY,瀏覽量和總火花數據幀使用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] 

回答

5

添加排名:

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")) 

排序,然後選擇:

測試星火2.1.0。

+0

優雅的解決方案。謝謝! – darXider