Почему mergeValue требуется в CombineByKey
Операция комбинировать ByKey в спарк принимает три функции, как показано ниже:
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))
,
Я понимаю, как работает combByKey. Но похоже, что mergeValue является избыточным. Я уверен, что что-то упустил. Обеспечивает ли это повышение производительности за счет замены двух вызовов функций одним или это что-то еще?