2016-05-04 3 views
5

Wie kann die maximale Zeile (Wert), die jedem eindeutigen Schlüssel in einer Funke-RDD zugeordnet ist, am besten zurückgegeben werden?Den maximalen Wert für jeden Schlüssel in einem Spark-RDD abrufen

Ich benutze Python und ich habe Math Max versucht, Zuordnung und Reduzierung von Schlüsseln und Aggregaten. Gibt es einen effizienten Weg, dies zu tun? Möglicherweise eine UDF?

Ich habe in RDD Format:

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

Und ich muss zurück:

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

Krawatten können den ersten Wert oder Zufalls zurückzukehren.

Antwort

10

Eigentlich haben Sie ein PairRDD. Eine der besten Möglichkeiten, es zu tun ist, mit reduceByKey:

(Scala)

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

(Python)

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

API doc für reduceByKey:

+0

können Sie eine Möglichkeit, dies auch in Java zu tun? Ich benutze Java und suche nach genau der gleichen Sache – tsar2512

+0

@zar2512 Mit Java 8 könnte dies funktionieren: 'neue JavaPairRDD (RDD). ReducedByKey ((v1, v2) -> Math.max (v1, v2));' –

+0

Danke für die Antwort, leider verwende ich Java 7 - es erlaubt keine Lambda-Funktionen. Typischerweise muss man anonyme Funktionen schreiben. Können Sie mir mitteilen, was die Lösung in Java 7 wäre? Ich bitte um eine einfache Komparatorfunktion sollte funktionieren! – tsar2512