Spark中的aggregate和aggregateByKey的区别及疑惑

来源:互联网 发布:商城网站源码免费下载 编辑:程序博客网 时间:2024/06/05 12:05

aggregate(zeroValue,seq,comb,taskNums)

将初始值和第一个分区中的第一个元素传递给seq函数进行计算,然后将计算结果和第二个元素传递给seq函数,直到计算到最后一个值。第二个分区中也是同理操作。最后将所有分区的结果经过combine函数进行计算(先将前两个结果进行计算,将返回结果和下一个结果传给combine函数,以此类推),并返回最终结果。

>>> data = sc.parallelize((1,2,3,4,5,6),2)>>> def seq(a,b):...     print 'seqOp:'+str(a)+"\t"+str(b)...     return min(a,b)... >>> def combine(a,b):...     print 'comOp'+str(a)+"\t"+str(b)...     return a+b... >>> data.aggregate(3,seq,combine)seqOp:3  1seqOp:1  2seqOp:1  3seqOp:3  4seqOp:3  5seqOp:3  6comOp:3  1comOp:4  37>>>

从上面的代码的输出结果可以看出,1,2,3被分到一个分区中,4,5,6被分到一个分区中。3先和第一个元素1传给seq函数,返回最小值1,然后将1和第二个元素2传给seq函数,返回1,以此类推,最后返回第一个分区中的最小值1。第二个分区一样道理,最后结果返回最小值3.最后将初始值3和两个分区的结果经过combine函数进行计算,先将初始值3和第一个分区的结果1传给combine函数,返回4,然后将4和第二个分区结果3传给combine函数,返回最终结果7。

aggregateByKey(zeroValue,seq,comb,taskNums)

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

见代码:

>>> data = sc.parallelize([(1,3),(1,2),(1,4),(2,3)])>>> def seq(a,b):...     return max(a,b)... >>> def combine(a,b):...     return a+b... >>> data.aggregateByKey(3,seq,comb,4).collect()[(1, 10), (2, 3)]

但是,在使用时遇到了问题,困惑:

在启动pyspark时,如果是./bin/pyspark –master local[3]或3以上的数字或*都会返回预期的结果。
如果数字小鱼等于2,结果就会有出入。如[(1,7)(2,3)]。
不知道什么原因,网上有人说:怀疑对于data的计算默认使用并行计算,而我们设置lcoal时没有指定所用的cores数目,导致并行计算无法执行,只能保持某个计算结果,最终导致计算结果的错误。。。

0 0
原创粉丝点击