Spark中的reduceByKey()和groupByKey()的區別


一、先看結論
1.從Shuffle的角度

reduceByKey 和 groupByKey都存在shuffle操作,但是reduceByKey可以在shuffle之前對分區內相同key的數據集進行預聚合(combine)功能,這樣會較少落盤的數據量,而groupByKey只是進行分組,不存在數據量減少的問題,reduceByKey性能比較高

2.從功能的角度

reduceByKey其實包含分組和聚合的功能;groupByKey只能分組,不能聚合,所以在分組聚合的場合下,推薦使用reduceByKey,如果僅僅是分組而不需要聚合,那么還是只能使用groupByKey。

用WordCount程序來舉例。

val words = Array("one", "two", "two", "three", "three", "three")
val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))

val wordCountsWithReduce = wordPairsRDD
  .reduceByKey(_ + _)
  .collect()

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

這兩種做法的結果都是正確的。

在大的數據集上,reduceByKey()的效果比groupByKey()的效果更好一些。因為reduceByKey()會在shuffle之前對數據進行合並

如圖所示:
下面一張圖就能表示reduceByKey()都做了什么。

 而當我們調用groupByKey()的時候,所有的鍵值對都會被shuffle到下一個stage,傳輸的數據比較多,自然效率低一些。

 

 Ref:(40條消息) 一文看懂Spark中reduceByKey 和 groupByKey 的區別_TRX的博客-CSDN博客_spark中reducebykey和groupbykey區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM