概念

  1. def reduceByKey(func: (V, V) => V): RDD[(K, V)] = self.withScope {
  2. reduceByKey(defaultPartitioner(self), func)
  3. }



相同的key到一组,然后对value进行运算,怎么计算?就通过reduceByKey的入参函数进行运算,
做完聚合运算之后还可以重新分区.

在一个(K,V)的 RDD 上调用,返回一个(K,V)的 RDD,使用指定的reduce函数,将相同key的value聚合到一起,reduce任务的个数可以通过第二个可选的参数来设置。

image.png

**
先做分区内的聚合,然后进行shuffle过程给相同key的数据放到一个分区,最后将相同的key进行聚合.

案例

  1. import org.apache.spark.rdd.RDD
  2. import org.apache.spark.{SparkConf, SparkContext}
  3. object Transformation_reduceByKey {
  4. def main(args: Array[String]): Unit = {
  5. val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[*]")
  6. val sc: SparkContext = new SparkContext(conf)
  7. val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("b", 3), ("a", 5), ("b", 2)))
  8. //在匿名函数里面指定value运算规则
  9. //求和运算
  10. val resRDD: RDD[(String, Int)] = rdd.reduceByKey((x, y) => x + y)
  11. // rdd.reduceByKey((x,y) => x+y) 可以简写为 rdd.reduceByKey(_ + _)
  12. resRDD.collect().foreach(println)
  13. // 关闭连接
  14. sc.stop()
  15. }
  16. }