Это хорошо известная проблема с искрой.Даже если вы произвели повторное разбиение, искра данных будет перетасовывать данные.
В чем проблема
Повторный раздел гарантирует, что каждый раздел содержит данные об одном значении столбца.
Хороший пример здесь:
val people = List(
(10, "blue"),
(13, "red"),
(15, "blue"),
(99, "red"),
(67, "blue")
) val peopleDf = people.toDF ("age", "color") colorDf = peopleDf.repartition ($ "color")
Partition 00091
13,red
99,red
Partition 00168
10,blue
15,blue
67,blue
ОднакоСпарк не запоминает эту информацию для последующих операций.Также общее упорядочение разделов между различными разделами не поддерживается в искре.то есть spark знает, что для одного раздела он имеет данные об одном разделе, но не знает, какие другие разделы имеют данные об этом же столбце.Также сортировка необходима в данных, чтобы гарантировать, что перемешивание не требуется.
Как вы можете решить
Вам необходимо использовать свечу Функция объединения
функция, обеспечивающая отсутствие перемешивания на последующих этапах.
Я обнаружил, что Wiki довольно подробно описывает функции группирования.
Bucketing - это метод оптимизации в Spark SQL, в котором для определения разбиения данных используются сегменты и сегментированные столбцы.
Мотивация состоит в том, чтобы оптимизировать производительность запроса на соединение, избегая перемешиваний (иначе называемых обменами).) таблиц, участвующих в объединении.Группировка приводит к меньшему количеству обменов (и т. Д. Этапов).