Spark reduceByKey 与 groupByKey 的区别
从 shuffle 的角度:
reduceByKey 和 groupByKey 都存在 shuffle 的操作,
但是 reduceByKey 可以在 shuffle 前对分区内相同 key 的数据进行预聚合(combine)功能,这样会减少落盘的 数据量,
而 groupByKey 只是进行分组,不存在数据量减少的问题,
reduceByKey 性能比较 高。
从 功能 的角度:
reduceByKey 其实包含分组和聚合的功能。
GroupByKey 只能分组,不能聚合,
所以在分组聚合的场合下,推荐使用 reduceByKey,
如果仅仅是分组而不需要聚合,那么还是只能使用 groupByKey。
图解
reduceByKey
groupByKey
代码
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object ReduceByKey_GroupByKey {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("ReduceByKey_GroupByKey")
val context = new SparkContext(conf)
val dataRDD = context.makeRDD(List(("a", 1), ("a", 1), ("b", 1)))
val resultRDD1: RDD[(String, Int)] = dataRDD.reduceByKey(_ + _)
val resultRDD2: RDD[(String, Iterable[Int])] = dataRDD.groupByKey()
resultRDD1.foreach(println)
/**
* (b,1)
* (a,2)
*/
resultRDD2.foreach(println)
/**
* (b,CompactBuffer(1))
* (a,CompactBuffer(1, 1))
*/
val resultRDD21: RDD[(String, Int)] = resultRDD2.map(a => (a._1, a._2.sum))
resultRDD21.foreach(println)
/**
* (b,1)
* (a,2)
*/
context.stop()
}
}