RDD-aggregateByKey

参数:(zeroValue:U,[partitioner: Partitioner]) (seqOp: (U, V) => U,combOp: (U, U) => U)

1. 作用:在kv对的RDD中,,按key将value进行分组合并,合并时,将每个value和初始值作为seq函数的参数,进行计算,返回的结果作为一个新的kv对,然后再将结果按照key进行合并,最后将每个分组的value传递给combine函数进行计算(先将前两个value进行计算,将返回结果和下一个value传给combine函数,以此类推),将key与计算结果作为一个新的kv对输出。

2. 参数描述:

(1)zeroValue:给每一个分区中的每一个key一个初始值;

(2)seqOp:函数用于在每一个分区中用初始值逐步迭代value;

(3)combOp:函数用于合并每个分区中的结果。

案例:

// 创建一个有2个分区的RDD
val pairRDD = sc.parallelize(List( ("cat",2), ("cat", 5), ("mouse", 4),("cat", 12), ("dog", 12), ("mouse", 2)), 2) // pairRDD: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[12] at parallelize at <console>:24 pairRDD.collect // res27: Array[(String, Int)] = Array((cat,2), (cat,5), (mouse,4), (cat,12), (dog,12), (mouse,2))
// 计算每个分区相同key对应值的加和,最后求结果之和 pairRDD.aggregateByKey(0)(_+_,_+_).collect // res28: Array[(String, Int)] = Array((dog,12), (cat,19), (mouse,6))

 以下是pairRDD.aggregateByKey(0)(_+_,_+_)的逻辑图。

注意:

RDD内只是逻辑上的数据,不存物理数据。一个Partition对应一个Task,Task负责处理运算对应分区的数据。

aggregateByKey有Shuffle的过程,创建RDD的时候有多少个Partition,新生成的RDD就有多少个Partition。

原文地址:https://www.cnblogs.com/lucas-zhao/p/12101839.html