Spark中reduceByKey、groupByKey和combineByKey的区别

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

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

Spark中reduceByKey、groupByKey和combineByKey的区别_第1张图片

Spark中reduceByKey、groupByKey和combineByKey的区别_第2张图片

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

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

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

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

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

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

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

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








你可能感兴趣的:(Spark)