2016-05-04 7 views
5

スパークRDDの各ユニークキーに関連付けられた最大行(値)を返す最適な方法は何ですか?Spark RDDの各キーの最大値を取得

私はPythonを使用しています。私はMath maxを試してみました。マッピングとキーと集計による縮小です。これを行う効率的な方法はありますか?おそらくUDFですか?

私はRDD形式で持っている:

[(v, 3), 
(v, 1), 
(v, 1), 
(w, 7), 
(w, 1), 
(x, 3), 
(y, 1), 
(y, 1), 
(y, 2), 
(y, 3)] 

そして、私は返す必要があります:

[(v, 3), 
(w, 7), 
(x, 3), 
(y, 3)] 

ネクタイは、最初の値またはランダムに返すことができます。

答えて

10

実際にはPairRDDがあります。それを行うための最善の方法の一つは、reduceByKeyである:

(スカラ)

val grouped = rdd.reduceByKey(math.max(_, _)) 

(パイソン)

grouped = rdd.reduceByKey(max) 

(Javaの7)

JavaPairRDD<String, Integer> grouped = new JavaPairRDD(rdd).reduceByKey(
    new Function2<Integer, Integer, Integer>() { 
     public Integer call(Integer v1, Integer v2) { 
      return Math.max(v1, v2); 
    } 
}); 

(Javaの8 )

JavaPairRDD<String, Integer> grouped = new JavaPairRDD(rdd).reduceByKey(
    (v1, v2) -> Math.max(v1, v2) 
); 

reduceByKeyのためのAPIドキュメント:

+0

あなたにもJavaでこれを行う方法を与えることができますか?私はJavaを使っていて、まったく同じものを探しています – tsar2512

+0

@ tsar2512 Java 8の場合、これはうまくいくかもしれません: 'new JavaPairRDD(rdd).reduceByKey((v1、v2) - > Math.max(v1、v2));' –

+0

応答のおかげで、残念ながら、私はJava 7を使用しています - それはラムダ機能を許可していません。通常、匿名の関数を記述する必要があります。 Java 7の解決策を教えてください。私は単純なコンパレータ関数が動作する必要がありますsuspext! – tsar2512

関連する問題