聚集各分区内的元素,并利用combOp和zerovalue函数将各分区合并
The functions op(t1, t2) is allowed to modify t1 and return it as its result value to avoid object allocation; however, it should not modify t2.
函数 op(t1, t2) 允许修改t1,并且将其返回, 这样可以避免重新分配对象。 它不能修改t2
>>> seqOp = (lambda x, y: (x[0] + y, x[1] + 1))
>>> combOp = (lambda x, y: (x[0] + y[0], x[1] + y[1]))
#样例1
>>> rdd1=sc.parallelize([1,2,3,4],4)
>>> rdd1.getNumPartitions()
4
>>> rdd1.glom()
PythonRDD[33] at RDD at PythonRDD.scala:43
>>> rdd1.glom().collect()
[[1], [2], [3], [4]]>>> rdd1.aggregate((0, 0), seqOp, combOp)
(10, 4)
#样例2
>>> rdd2=sc.parallelize([1,2,3,4,5],3)
>>> rdd2.getNumPartitions()
3
>>> rdd2.glom()
PythonRDD[37] at RDD at PythonRDD.scala:43
>>> rdd2.glom().collect()
[[1], [2, 3], [4, 5]]>>> rdd2.aggregate((1, 1), seqOp, combOp)
(19, 9)
依次解释上述函数
1、建立各分区内的聚集函数,又初始值依次与分区内的函数做操作
2、建立各分区间的组合函数,
3、使用aggregate 样例1
4、使用aggregate 样例2
样例1 解释:
分区数 : 4
0 : 1
1 : 2
2 : 3
3 : 4
利用zerovalue (0,0) 和 seqOp 对各分区进行聚集 :
0 : (0,0)+(1,1)
1 : (0,0)+(2 , 1)
2 : (0,0)+(3,1)
3: (0,0)+(4 , 1)
利用 zerovalue和combOp 进行各分区间的聚合 :
(0,0) + (1,1)+ (2,1)+ (3,1)+ (4,1) = (10,4)
样例2 解释:
分区数 : 3
0 : 1
1 : 2,3
2 : 4,5
利用zerovalue (1,1) 和 seqOp 对各分区进行聚集 :
0 :(1,1)+(1,1) = (2,2)
1 : (1,1)+(2,1) +(3,1) = (6,3)
2 : (1,1) +(4,1)+(5,1) = (10,3)
利用 zerovalue和combOp 进行各分区间的聚合 :
(1,1)+(2,2) + (6,3) + (10,3) = (19,9)
程序运行结果:
>>> seqOp = (lambda x, y: (x[0] + y, x[1] + 1))
>>> combOp = (lambda x, y: (x[0] + y[0], x[1] + y[1]))
>>> sc.parallelize([1,2,3,4],4).aggregate((0, 0), seqOp, combOp)
(10, 4)
>>> sc.parallelize([1,2,3,4,5],3).aggregate((1, 1), seqOp, combOp)
(19, 9)
参考:https://blog.csdn.net/a1628864705/article/details/52757384