2016-05-04 17 views
5

Jaki jest najlepszy sposób na zwrócenie maksymalnego wiersza (wartości) powiązanego z każdym unikalnym kluczem w iskrowym RDD?Uzyskaj maksymalną wartość dla każdego klucza w Spark RDD

Używam Pythona i próbowałem Math max, mapowanie i zmniejszanie o klucze i agregaty. Czy istnieje skuteczny sposób na zrobienie tego? Prawdopodobnie UDF?

mam w formacie RDD:

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

I muszę wrócić:

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

Krawaty może powrócić pierwsza wartość lub losowo.

Odpowiedz

10

W rzeczywistości masz paręRDD. Jednym z najlepszych sposobów na to jest z 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) 
); 

doc API dla reduceByKey:

+0

można dać sposób to zrobić w Javie, jak również? Używam java i szukam dokładnie tego samego. – tsar2512

+0

@ tsar2512 Z Java 8 może to działać: 'new JavaPairRDD (rdd) .reduceByKey ((v1, v2) -> Math.max (v1, v2));' –

+0

dziękuję za odpowiedź, niestety używam Java 7 - nie pozwala na funkcje lambda. Zazwyczaj trzeba pisać anonimowe funkcje. Czy możesz dać mi znać, jakie będzie rozwiązanie w Java 7? Podejrzewam, że powinna działać prosta funkcja komparatora! – tsar2512

Powiązane problemy