aggregate():这个函数需要三个zeroValue, seqOp, combOp。zeroValue是初始值,形式是(x,y);seqOp和combOP是两个方法,其中seqOp方法是对每个分区操作,然后combOp对每个分区的结果进行操作。
>>> data=[1,2,3,4,5,6,7,8,9]
>>> rdd=sc.parallelize(data,2)
#分成了两个分区,第一个分区中存放的是1,2,3,4,其余的在第二个分区
>>> seqOp = (lambda x, y: (x[0] + y, x[1] + 1))
>>> combOp = (lambda x, y: (x[0] + y[0], x[1] + y[1]))
#seqOp对第一个分区(同时并行的对第二个分区进行同样的操作)进行操作步骤是
#开始先用初始值和第一个分区的第一个值,然后是结果和其余的值进行操作
#0+1,0+1
#1+2,1+1
#3+3,2+1
#6+4,3+1
#结果是(10,4),同样的第二个分区的结果是(35,5)
#combOp对两个分区的结果以及初始值本身进行操作
#(10+35,9)
>>> a=rdd.aggregate((0,0),seqOp,combOp)
>>> print(a)
(45,9)
#求每个分区的最大值的和
>>> fa = lambda x, y:( x[0] if x[0] > y else y,x[1]+1)
>>> a=rdd.aggregate((0,0),fa,combOp)
>>> print(a)
(13, 9)
>>> a=rdd.aggregate((5,0),fa,combOp)
#因为第一个分区和5比较的最大值是5
#所以结果应该是5(第一个分区)+9(第二个分区)+5(初始值)
>>> print(a)
(19, 9)
data2=['a','b','c','d','e','f']
>>> funa=lambda x,y:(x[0]+y,x[1]+'*')
>>> funb=lambda x,y:(x[0]+y[0],x[1]+y[1])
>>> b=rdd.aggregate(('',''),funa,funb)
>>> print(b)
('abcdef', '******')
>>> b=rdd.aggregate(('','&'),funa,funb)
>>> print(b)
('abcdef', '&&***&***')