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

0 ответов

Другие вопросы по тегам