Spark RDD (не PairRDD) с пользовательским разделителем - PullRequest
0 голосов
/ 28 июня 2019

Могу ли я создать Spark RDD (не PairRDD) с пользовательским Partitioner? Кажется, я не нашел в API ничего такого, что позволило бы ... Метод partitionBy работает только на PairRDD s

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Боюсь, вы не можете. Именно так были разработаны API. Вам нужно поставить тег против записи, чтобы вы могли сказать, что хотите отправить его в данный раздел.

Если у вас нет почтового индекса на письме, почтальон не может решить, куда его нужно отправить.

Если у вас, естественно, нет ключей в вашем RDD, вы можете создать их программно, используя следующие API-

zipWithIndex()
zipWithUniqueId()
0 голосов
/ 28 июня 2019

AFAIK, вы не можете, и я понимаю, почему следующее:

Когда Apache Spark считывает данные, он рассматривает их как своего рода черный ящик *.Таким образом, фреймворк не может сказать: «О, здесь у меня есть строка X, поэтому я должен поместить ее в раздел 1» на самом начальном этапе, где он не имеет представления о том, что внутри.Вместо этого платформа будет использовать множество различных параметров, таких как количество разделов, размер разбиения и т. Д., Чтобы выяснить, сколько данных необходимо прочитать из данного источника в каждой задаче (параметры будут зависеть от источника).Таким образом, идея состоит в том, чтобы назначать меньшие части большого набора данных в задачи (разделы), а не анализировать каждую строку / строку / запись / что угодно и сообщать, где он может приземлиться.Даже для источников данных с собственным разделением, таких как Apache Kafka, Spark работает таким образом, то есть без интерпретации данных для разделения.IMO - это одно из основных различий между инфраструктурой распределенной обработки данных и распределенным хранилищем данных, где иногда вы можете определить свою собственную логику разделения, но только потому, что вы получаете некоторые конкретные данные вместо «мешка» данных.Другими словами, раздел Spark больше привязан к логике разделения источника данных, чтобы использовать параллелизм источника для начального чтения.

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

Кроме того, если вы посмотритена org.apache.spark.rdd.RDD#partitioner вы увидите, что он в основном задействован для операций, связанных с перемешиванием - что-то, что хотел пользователь.Он не используется для распределения данных, прочитанных в самом начале вычисления.

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

* - не всегда.Например, когда вы используете JDBC с Spark SQL, вы можете определить столбец, используемый для разделения, который будет использоваться в качестве разновидности разделения диапазона с ключом.Но это больше благодаря организации хранения (структурированные данные).

...