Ответ 1
groupByKey
отлично подходит для случая, когда нам нужен "маленький" набор значений для ключа, как в вопросе.
TL; DR
Предупреждение "не использовать" на groupByKey
применяется для двух общих случаев:
1) Вы хотите агрегировать по значениям:
- НЕ:
rdd.groupByKey().mapValues(_.sum)
- DO:
rdd.reduceByKey(_ + _)
В этом случае groupByKey
будет тратить ресурсы на материализацию коллекции, а то, что мы хотим, - это один элемент в качестве ответа.
2) Вы хотите группировать очень большие коллекции по клавишам с низкой мощностью:
- НЕ:
allFacebookUsersRDD.map(user => (user.likesCats, user)).groupByKey()
- ПРОСТО НЕ
В этом случае groupByKey
потенциально может привести к ошибке OOM.
groupByKey
материализует коллекцию со всеми значениями для одного и того же ключа в одном исполнителе. Как уже упоминалось, у него есть ограничения памяти, и, следовательно, другие варианты лучше в зависимости от случая.
Все функции группировки, такие как groupByKey
, aggregateByKey
и reduceByKey
полагаются на базу: combineByKey
и, следовательно, нет другая альтернатива будет лучше для usecase в вопросе, все они полагаются на один и тот же общий процесс.