在spark中,reduceByKey、groupByKey和combineByKey这三种算子用的较多,其中:

reduceByKey用于对每个key对应的多个value进行merge操作,最重要的是它能够在本地先进行merge操作,并且merge操作可以通过函数自定义;
groupByKey也是对每个key进行操作,但只生成一个sequencegroupByKey本身不能自定义函数,需要先用groupByKey生成RDD,然后才能对此RDD通过map进行自定义函数操作

Spark中reduceByKey、groupByKey和combineByKey的区别

Spark中reduceByKey、groupByKey和combineByKey的区别

比较发现,使用groupByKey时,spark会将所有的键值对进行移动,不会进行局部merge,会导致集群节点之间的开销很大,导致传输延时。

CombineByKey是一个比较底层的算子,用法如下:

combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner,mapSideCombine)

createCombiner:在第一次遇到Key时创建组合器函数,将RDD数据集中的V类型值转换C类型值(V => C);

Spark中reduceByKey、groupByKey和combineByKey的区别

mergeValue:合并值函数,再次遇到相同的Key时,将createCombinerC类型值与这次传入的V类型值合并成一个C类型值(C,V=>C

Spark中reduceByKey、groupByKey和combineByKey的区别

mergeCombiners:合并组合器函数,将C类型值两两合并成一个C类型值

partitioner使用已有的或自定义的分区函数,默认是HashPartitioner 

mapSideCombine是否在map端进行Combine操作,默认为true








相关文章: