2016-05-04 25 views
5

Qual è il modo migliore per restituire la riga massima (valore) associata a ciascuna chiave univoca in un RDD spark?Ottieni il valore massimo per ogni chiave in un RDD Spark

Sto usando python e ho provato Math max, mappando e riducendo per chiavi e aggregati. C'è un modo efficace per farlo? Forse un UDF?

ho in formato RDD:

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

e ho bisogno di tornare:

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

Ties possono restituire il primo valore o casuale.

risposta

10

In realtà si dispone di un PairRDD. Uno dei modi migliori per farlo è con 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 per reduceByKey:

+0

può darvi un modo per fare questo in Java come bene? Sto usando java e sto cercando esattamente la stessa cosa – tsar2512

+0

@ tsar2512 Con Java 8, questo potrebbe funzionare: 'nuovo JavaPairRDD (rdd) .reduceByKey ((v1, v2) -> Math.max (v1, v2));' –

+0

grazie per la risposta, sfortunatamente, sto usando Java 7 - non consente le funzioni lambda. Di solito è necessario scrivere funzioni anonime. Potresti farmi sapere quale sarebbe la soluzione in Java 7? Sospetto che una semplice funzione di confronto dovrebbe funzionare! – tsar2512