一、先看結論
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區別