2016-05-04 22 views
5

Cách tốt nhất để trả lại hàng tối đa (giá trị) được liên kết với mỗi khóa duy nhất trong RDD tia lửa là gì?Lấy giá trị tối đa cho mỗi khóa trong Spark RDD

Tôi đang sử dụng python và tôi đã thử Math max, mapping và reduce bằng các phím và tập hợp. Có cách nào hiệu quả để làm việc này không? Có thể là một UDF?

tôi có trong định dạng RDD:

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

Và tôi cần phải trả lại:

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

Ties có thể trả về giá trị đầu tiên hoặc ngẫu nhiên.

Trả lời

10

Thực ra bạn có PairRDD. Một trong những cách tốt nhất để làm điều đó là với 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 cho reduceByKey:

+0

bạn có thể đưa ra một cách để làm điều này trong Java không? Tôi đang sử dụng java và tìm kiếm chính xác điều tương tự – tsar2512

+0

@ tsar2512 Với Java 8, điều này có thể hoạt động: 'new JavaPairRDD (rdd) .reduceByKey ((v1, v2) -> Math.max (v1, v2));' –

+0

cảm ơn cho phản ứng, không may, tôi đang sử dụng Java 7 - nó không cho phép các hàm lambda. Người ta thường phải viết các hàm ẩn danh. Bạn có thể cho tôi biết những gì sẽ là giải pháp trong Java 7? Tôi nghi ngờ một hàm so sánh đơn giản sẽ hoạt động! – tsar2512

Các vấn đề liên quan