GroupByKey vs Присоединиться к выступлению в Spark - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть RDD как (id, (val1, val2)).Я хочу нормализовать значения val2 для каждого идентификатора путем деления на сумму всех val2 для этого конкретного идентификатора.Поэтому мой вывод должен выглядеть следующим образом: (id, (val1, val2normalized))

Это можно сделать двумя способами:

  1. Выполнить groupByKey для идентификатора с последующей нормализацией значения с использованием mapValues.
  2. Выполните reduceByKey, чтобы получить СДР наподобие (id, val2sum), и присоедините этот СДР к исходному СДР, чтобы получить (id, ((val1, val2), val2sum)), а затем mapValues для нормализации.

Какой из них выбрать?

1 Ответ

0 голосов
/ 22 ноября 2018

Если вы ограничиваете себя:

  • RDD API.
  • groupByKey + mapValues против reduceByKey + join

прежний будет предпочтительным.Так как RDD.join реализован с использованием cogroup, стоимость последней стратегии может быть только выше, чем groupByKey (cogroup на нередуцированном RDD будет эквивалентно groupByKey, но вам дополнительно понадобится полный тасование дляreduceByKey).Пожалуйста, имейте в виду, что если группы слишком велики, ни одно из решений не будет осуществимо.

Однако это может быть не оптимальным выбором.В зависимости от размера каждой группы и общего количества групп, вы можете достичь гораздо лучшей производительности, используя широковещательное соединение .

В то же время DataFrame API поставляется со значительноулучшено внутреннее перемешивание и может автоматически применяться некоторая оптимизация, включая широковещательные соединения.

...