2017-05-23 61 views
5

Gần đây tôi đã có kịch bản để lưu trữ dữ liệu trong cặp KeyValue và đi qua một hàm reduceByKey(_ ++ _). Đây là cú pháp viết tắt hơn. Tôi không thể hiểu điều này thực sự có ý nghĩa gì.Ý nghĩa của reduceByKey (_ ++ _)

Ex: reduceBykey(_ + _) nghĩa reduceByKey((a,b)=>(a+b))

Vì vậy reduceByKey(_ ++ _) phương tiện ??

Tôi có thể tạo cặp khóa giá trị ngoài dữ liệu bằng cách sử dụng reduceByKey(_ ++ _).

val y = sc.textFile("file:///root/My_Spark_learning/reduced.txt") 

y.map(value=>value.split(",")) 
    .map(value=>(value(0),value(1),value(2))) 
    .collect 
    .foreach(println) 

(1,2,3) 
(1,3,4) 
(4,5,6) 
(7,8,9) 

y.map(value=>value.split(",")) 
    .map(value=>(value(0),Seq(value(1),value(2)))) 
    .reduceByKey(_ ++ _) 
    .collect 
    .foreach(println) 

(1,List(2, 3, 3, 4)) 
(4,List(5, 6)) 
(7,List(8, 9)) 

Trả lời

4

reduceByKey(_ ++ _) dịch sang reduceByKey((a,b) => a ++ b).

++method được xác định trên List kết hợp danh sách khác với nó.

Vì vậy, cho khóa 1 trong các dữ liệu mẫu, a sẽ List(2,3)b sẽ List(3,4) và do đó nối của List(2,3)List(3,4) (List(2,3) ++ List(3,4)) sẽ mang lại List(2,3,3,4).

+0

Cảm ơn bạn đã giải thích. –

1

reduceByKey(_ ++ _) tương đương với reduceByKey((x,y)=> x ++ y) reduceByKey có hai tham số, áp dụng một hàm và trả về

Vào đầu tiên nó thùng một bộ và ++ chỉ bổ sung thêm bộ sưu tập với nhau, kết hợp các yếu tố của cả hai bộ.

Đối với mỗi khóa Nó tiếp tục thêm vào danh sách. Trong trường hợp của bạn trong tổng số 1 như một x chìa khóa sẽ List(2,3) và y sẽ List (3,4)++ sẽ thêm cả như List (2,3,3,4)

Nếu bạn có một giá trị như (1,4,5) thì x sẽ List(4,5) trong trường hợp này và y nên List (2,3,3,4) và kết quả sẽ là List(2,3,3,4,4,5)