2017-01-15 4 views
2

を使用して集計スパークデータフレームIがどのように見えるデータフレームがあります。グループでは、ランクとpyspark

私は相対的な順位(高いscore->より良いランク)に列「C」を変換するにはどうすればよい
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 

を列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

関連する問題