Я пытаюсь приспособить процесс к искрам. В основном, процесс анализирует партии данных из источника данных JDBC , каждая запись имеет BatchId, а также более высокий уровень groupId.Эффективная группировка по ключевым разделам «внутри»
Количество партий большое (неизвестно заранее).
Число групп ~ 100.
Количество записей для каждой партии может поместиться в ОЗУ.
Фактический код анализа не имеет значения, но это не соответствует более конкретных моделей reduceByKey или combineByKey
Моя идея была:
использование jdbcRdd прочитать данных, используйте «идентификатор группы» для разбиения на разделы
группа использования bybatchId для подготовки данных
использовать карту для применения бизнес-логики.
горлышко бутылки, как представляется, groupByKey, что из моего понимания заставит перетасовать (запись данных на диск) - даже если каждая партия содержатся в одном разделе.
Другой возможный подход заключается в использовании batchId для разделения, но это создаст очень большое количество разделов - и для этого большое количество запросов
Есть ли способ выполнить группу по ключу в пределах раздела? Любой другой возможный подход?
Вы можете сделать почти что угодно на основе раздела с использованием метода 'mapPartitions()' на RDD' - вы просто предоставляете функцию, которая принимает итератор в данных раздела и возвращает один из данных результата, который могут быть другого типа. Вы можете выполнять группировку с помощью карты, которую вы отправляете обратно, когда у вас есть весь обработанный вход. –