2016-05-04 22 views
5

'daki her tuş için maksimum değeri alın Bir kıvılcım RDD'sindeki her benzersiz anahtarla ilişkili maksimum sırayı (değeri) döndürmenin en iyi yolu nedir?Bir kıvılcım RDD

Python kullanıyorum ve Math max'ı, anahtar ve toplamalarla eşleme ve küçültmeyi denedim. Bunu yapmanın etkili bir yolu var mı? Muhtemelen bir UDF?

Ben RDD biçiminde var:

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

Ve geri gerekir:

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

Kravatlar ilk değeri veya rastgele döndürebilir.

cevap

10

Aslında bir DoubleRDD'niz var. Bunu yapmanın en iyi yollarından biri reduceByKey ile geçerli:

(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) 
); 
reduceByKey için

API doc:

+0

siz de Java ile bunun için bir yol verebilir? Ben java kullanıyorum ve tam olarak aynı şeyi arıyorum – tsar2512

+0

@ tsar2512 Java 8 ile, bu işe yarayabilir: Yeni JavaPairRDD (rdd) .reduceByKey ((v1, v2) -> Math.max (v1, v2)); –

+0

Cevabınız için teşekkürler, maalesef Java 7 kullanıyorum - lambda fonksiyonlarına izin vermiyor. Biri genellikle isimsiz işlevler yazmalıdır. Java 7'deki çözümün ne olabileceğini bana bildirir misiniz? Ben basit bir karşılaştırıcı işlevi suspext çalışması gerekir! – tsar2512

İlgili konular