在spark中,reduceByKey、groupByKey和combineByKey这三种算子用的较多,其中:
•
reduceByKey
用于对每个
key
对应的多个
value
进行
merge
操作,最重要的是它能够在本地先进行
merge
操作,并且
merge
操作可以通过函数自定义;
•
groupByKey
也是对每个
key
进行操作,但只生成一个
sequence
,
groupByKey
本身不能自定义函数,需要先用
groupByKey
生成
RDD
,然后才能对此
RDD
通过
map
进行自定义函数操作
比较发现,使用groupByKey时,spark会将所有的键值对进行移动,不会进行局部merge,会导致集群节点之间的开销很大,导致传输延时。
CombineByKey是一个比较底层的算子,用法如下:
combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner,mapSideCombine)
createCombiner:在第一次遇到Key时创建组合器函数,将RDD数据集中的V类型值转换C类型值(V => C);
mergeValue:合并值函数,再次遇到相同的Key时,将createCombiner的C类型值与这次传入的V类型值合并成一个C类型值(C,V)=>C
mergeCombiners:合并组合器函数,将C类型值两两合并成一个C类型值
partitioner:使用已有的或自定义的分区函数,默认是HashPartitioner
mapSideCombine:是否在map端进行Combine操作,默认为true