2014-09-28 2 views
2

Я пытаюсь приспособить процесс к искрам. В основном, процесс анализирует партии данных из источника данных JDBC , каждая запись имеет BatchId, а также более высокий уровень groupId.Эффективная группировка по ключевым разделам «внутри»

  • Количество партий большое (неизвестно заранее).

  • Число групп ~ 100.

  • Количество записей для каждой партии может поместиться в ОЗУ.

Фактический код анализа не имеет значения, но это не соответствует более конкретных моделей reduceByKey или combineByKey

Моя идея была:

  • использование jdbcRdd прочитать данных, используйте «идентификатор группы» для разбиения на разделы

  • группа использования bybatchId для подготовки данных

  • использовать карту для применения бизнес-логики.

горлышко бутылки, как представляется, groupByKey, что из моего понимания заставит перетасовать (запись данных на диск) - даже если каждая партия содержатся в одном разделе.

Другой возможный подход заключается в использовании batchId для разделения, но это создаст очень большое количество разделов - и для этого большое количество запросов

Есть ли способ выполнить группу по ключу в пределах раздела? Любой другой возможный подход?

+2

Вы можете сделать почти что угодно на основе раздела с использованием метода 'mapPartitions()' на RDD' - вы просто предоставляете функцию, которая принимает итератор в данных раздела и возвращает один из данных результата, который могут быть другого типа. Вы можете выполнять группировку с помощью карты, которую вы отправляете обратно, когда у вас есть весь обработанный вход. –

ответ

7

Да, вам необходимо использовать mapPartitions. Вы получаете доступ к Iterator по всем записям в разделе. Вы просто пишете код Scala и можете делать то, что вам нравится, включая создание карты идентификатора партии для записей. Это должно соответствовать памяти, разуму, но вы всегда можете уменьшить размер раздела, если это имеет значение.

Смежные вопросы