为什么在CombineByKey中需要mergeValue

时间:2018-06-04 07:54:45

标签: performance apache-spark rdd

spark中的combineByKey操作有三个函数,如下所示:

combineByKey(createCombiner, mergeValue, mergeCombiners).

mergeValue的结果可以使用createCombinermergeCombiner生成,如下所示。让函数定义如下:

createCombiner: v => (v, 1)
mergeValue: (acc: (Int, Int), v) => (acc._1 + v, acc._2 + 1)
mergeCombiner: (acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2)

让数据集如下:

Partition 1: ("key1", 2), ("key1", 3)

Partition 2: ("key1", 5), ("key2", 6)

遇到("key1", 2)时,createCombiner会生成:("key1", (2, 1))

当在同一分区中遇到("key1", 3)时,mergeValue将生成累加器"key1", (2+3, 1+1)),即("key1", (5, 2))

但是,createCombiner和mergeCombiner可以执行以下操作:

createCombiner("key1", 3)转换为("key1", (3, 1)) mergeCombiner需要("key1" (2, 1))("key1", (3, 1))并生成("key1", (5, 2))

我理解combineByKey是如何工作的。 但似乎mergeValue是多余的。我相信我错过了一些东西。它是通过用一个替换两个函数调用来提供性能提升还是其他什么?

0 个答案:

没有答案