Hỏi đáp về IT
Mã xác nhận Thay đổi một
Ngô Quang Hải quanghaisoft@yahoo.com Bigdata engineering - Backend-IT - MWG

groupByKey so với ReduceByKey trong Apache Spark

Duyệt qua: 61
groupByKey vs reduceByKey in Apache Spark

Cái nào tốt hơn groupByKey hay ReduceByKey?

https://www.edureka.co/community/11996/groupbykey-vs-reducebykey-in-apache-spark

 

Khi áp dụng  groupByKey ()  trên tập dữ liệu của các cặp (K, V), dữ liệu sẽ xáo trộn theo giá trị khóa K trong RDD khác  . Trong quá trình chuyển đổi này, rất nhiều dữ liệu không cần thiết truyền qua mạng.

Spark cung cấp khả năng lưu dữ liệu vào đĩa khi có nhiều dữ liệu xáo trộn trên một máy thực thi duy nhất hơn có thể vừa trong bộ nhớ.

Thí dụ:

val data = spark.sparkContext.parallelize (Array (('k', 5), ('s', 3), ('s', 4), ('p', 7), ('p', 5) , ('t', 8), ('k', 6)), 3)

val group = data.groupByKey (). collect ()

group.foreach (println)

 

Khi áp dụng  ReduceByKey  trên tập dữ liệu (K, V), trước khi trộn dữ liệu, các cặp trên cùng một máy với cùng một khóa được kết hợp.

Thí dụ:

val words = Array ("một", "hai", "hai", "bốn", "năm", "sáu", "sáu", "tám", "chín", "mười")

val data = spark.sparkContext.parallelize (words) .map (w => (w, 1)). ReduceByKey (_ + _)

data.collect.foreach (println) 

 
 

groupByKey:

Cú pháp:

sparkContext.textFile ("hdfs: //")
                    .flatMap (line => line.split (""))
                    .map (word => (word, 1))
                    .groupByKey ()
                    .map ((x, y) = > (x, sum (y)))
groupByKey có thể gây ra sự cố ngoài ổ đĩa khi dữ liệu được gửi qua mạng và được thu thập trên bộ giảm thiểu.

ReduceByKey:

Cú pháp:

sparkContext.textFile ("hdfs: //")
                    .flatMap (line => line.split (""))
                    .map (word => (word, 1))
                    .reduceByKey ((x, y) => (x + y))
Dữ liệu được kết hợp tại mỗi phân vùng, chỉ có một đầu ra cho một khóa tại mỗi phân vùng để gửi qua mạng. ReduceByKey yêu cầu kết hợp tất cả các giá trị của bạn thành một giá trị khác có cùng kiểu chính xác. 

 

Có hai cách khác nhau để tính số lượng:

val words = Array ("một", "hai", "hai", "ba", "ba", "ba")
val wordPairsRDD = sc.parallelize (từ) .map (từ => (từ, 1))

val wordCountsWithReduce = wordPairsRDD .reduceByKey (_ + _) .collect ()
val wordCountsWithGroup = wordPairsRDD .groupByKey () .map (t => (t._1, t._2.sum)) .collect ()

ReduceByKey sẽ tổng hợp khóa y trước khi xáo trộn và groupByKey sẽ trộn tất cả các cặp khóa giá trị như biểu đồ hiển thị. Trên dữ liệu kích thước lớn, sự khác biệt là rõ ràng.

   

Dưới đây Hình ảnh là tự giải thích cho phím giảm và phím nhóm 

 
bigdata 2020/11/23 11:03

Để lại dấu chân

Bước trên một chân

Bình luận

copyright © bigdata 2010-2020
Processed in 0 seconds, 0 queries