2017-06-28 5 views
1

私はSparkR DataFrameを持っていて、一意のそれぞれnameに対してモード(多くの場合)valueを取得したいと考えています。これどうやってするの?組み込みのmode機能はないようです。 SparkRまたはPySparkのいずれかのソリューションが動作します。spark列のgroupByでモード(多くの場合)値を取得する

#Create DF 
df <- data.frame(name = c("Thomas", "Thomas", "Thomas", "Bill", "Bill", "Bill"), 
    value = c(5, 5, 4, 3, 3, 7)) 
DF <- createDataFrame(df) 

name | value 
----------------- 
Thomas | 5 
Thomas | 5 
Thomas | 4 
Bill | 3 
Bill | 3 
Bill | 9 

#What I want to get 
name | mode(value) 
----------------- 
Thomas | 5 
Bill | 3 

答えて

2

あなたはこのような.groupBy()windowの方法を組み合わせ使用していることを達成できる:

grouped = df.groupBy('name', 'value').count() 
window = Window.partitionBy("name").orderBy(desc("count")) 
grouped\ 
    .withColumn('order', row_number().over(window))\ 
    .where(col('order') == 1)\ 
    .show() 

出力:

+------+-----+-----+-----+ 
| name|value|count|order| 
+------+-----+-----+-----+ 
| Bill| 3| 2| 1| 
|Thomas| 5| 2| 1| 
+------+-----+-----+-----+ 
+0

ありがとう、@pandaromeo。あなたは 'Window.partitionBy( '​​name')。orderBy(desc( 'count'))'が何をしているのか説明できますか?また、このコードをSparkRに変換する際に問題がありますが、 'windowPartitionBy'コマンドはそこに存在します。 –

+0

'groupBy'と' agg'の後に 'count'カラムがあります。あなたが昇順で 'orderBy'を実行すると想像してください。 'window'ではそれを並べ替えるだけでなく、あなたに興味のあるものだけをフィルタリングするインデックスを与えます。この場合、それらは 'モード(最も頻繁に)value'です。残念ながら私はRの経験がないので、SparkRに翻訳することはできません。 –

+0

実際には、このリンクでよく説明されています:https://github.com/apache/spark/blob/master/R/pkg/vignettes/sparkr-vignettes.Rmd。 –

0

はここソリューションのSparkRバージョンがあります:

grouped <- agg(groupBy(df, 'name', 'value'), count=count(df$value)) 
window <- orderBy(windowPartitionBy("name"), desc(grouped$count)) 
dfmode <- withColumn(grouped, 'order', over(row_number(), window)) 
dfmode <- filter(dfmode, dfmode$order==1) 
関連する問題