AFAIK, вы не можете, и я понимаю, почему следующее:
Когда Apache Spark считывает данные, он рассматривает их как своего рода черный ящик *.Таким образом, фреймворк не может сказать: «О, здесь у меня есть строка X, поэтому я должен поместить ее в раздел 1» на самом начальном этапе, где он не имеет представления о том, что внутри.Вместо этого платформа будет использовать множество различных параметров, таких как количество разделов, размер разбиения и т. Д., Чтобы выяснить, сколько данных необходимо прочитать из данного источника в каждой задаче (параметры будут зависеть от источника).Таким образом, идея состоит в том, чтобы назначать меньшие части большого набора данных в задачи (разделы), а не анализировать каждую строку / строку / запись / что угодно и сообщать, где он может приземлиться.Даже для источников данных с собственным разделением, таких как Apache Kafka, Spark работает таким образом, то есть без интерпретации данных для разделения.IMO - это одно из основных различий между инфраструктурой распределенной обработки данных и распределенным хранилищем данных, где иногда вы можете определить свою собственную логику разделения, но только потому, что вы получаете некоторые конкретные данные вместо «мешка» данных.Другими словами, раздел Spark больше привязан к логике разделения источника данных, чтобы использовать параллелизм источника для начального чтения.
Еще один момент заключается в том, что явным разделомByB также является ваше намерение.Делая это, вы говорите, что конвейеру нужно будет иметь все данные для этого конкретного ключа в одном и том же разделе, чтобы вы могли выполнять агрегирующие или любые другие операции группировки.
Кроме того, если вы посмотритена org.apache.spark.rdd.RDD#partitioner
вы увидите, что он в основном задействован для операций, связанных с перемешиванием - что-то, что хотел пользователь.Он не используется для распределения данных, прочитанных в самом начале вычисления.
Поэтому, чтобы подвести итог и немного пояснить, я бы выделил две категории для разбиения.Первый касается источников данных, и здесь вам нужно поиграть со свойствами конфигурации, предоставляемыми платформой.Второй - это разделитель бизнес-логики, в котором после преобразования плоского RDD в пару RDD и здесь операция рассматривается как операция группировки, поскольку она выражает намерение иметь все подобные данные в одном и том же разделе, чтобы что-то с ним делать (агрегирует, генерация сессии, ...)
* - не всегда.Например, когда вы используете JDBC с Spark SQL, вы можете определить столбец, используемый для разделения, который будет использоваться в качестве разновидности разделения диапазона с ключом.Но это больше благодаря организации хранения (структурированные данные).