foldByKey算子aggregateByKey算子reducebykey
groupByKey,group,reduceByKey,foldByKey,aggregateByKey 都可以算作聚合类算子。
聚合类算子,在map side端产生结果后,把结果保留在本地buffer中,如果满了或者这个节点的这次RDD任务执行完了,就会把结果刷新到磁盘上给下游的task,也就是reduce side端拉取进行全局聚合
其中reduceByKey,foldByKey,aggregateByKey 效果很相似,下面记录一下他们的差别
这三个都是支持在Map端进行各自节点的局部聚合的,也就是MapSideCombine这个参数是设置为true的,而group和groupbykey的这个参数是设置为false的
foldByKey是一个柯里化的函数,第一个参数是初始值,第二个是函数。

可以很明显的在
combineByKeyWithClassTag
函数中看到调用三次传入的函数,第一次对初始值和分区内同一个分组的数据进行,第二次将第一次的值和同一个分组内的下一个数据进行函数操作(单节点局部聚合)。第三次在全局聚合中使用。

比如,初始值传入100,函数逻辑为同名key 的聚集算总和。
第一次 0号节点内 spark 100+1=101
第二次 0号节点 spark 101+1=102
一号节点同理
第三次 在reduce side端,一号节点的102和0号节点的102相加等于204。
初始值的使用只在分区组内第一条数据相加使用,之后只使用函数逻辑
、
aggregateByKey 是一个柯里化的函数,第一个参数是初始值,第二个是分区内使用的函数,第三个是全局聚合使用的函数。
他的使用和foldbykey中初始值的使用和函数的使用都差不多。唯一的区别是在单节点分区使用的聚合函数,和在全局使用的函数可以设置的不一样

可以很明显的在
combineByKeyWithClassTag
函数中看到分区内的函数调用俩次,全局函数调用一次。第一次对初始值和分区内同一个分组的数据进行分区函数,第二次将第一次的值和同一个分组内的下一个数据进行分区函数操作。最后使用全局聚合函数

reduceByKey就只是一个普通的函数,只需要传入一个函数就可以了,

可以看到func函数被调用了俩次,在分区内对同组数据使用一次,在全局在使用一次。(就是这个函数在map side 端使用一次进行各自分区的局部聚合,然后再次在reduce side端使用一次进行全局的聚合)


浙公网安备 33010602011771号