spark中的combineByKey操作有三个函数,如下所示:
combineByKey(createCombiner, mergeValue, mergeCombiners).
mergeValue
的结果可以使用createCombiner
和mergeCombiner
生成,如下所示。让函数定义如下:
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是多余的。我相信我错过了一些东西。它是通过用一个替换两个函数调用来提供性能提升还是其他什么?