Как сохранить разбиение с помощью операций с фреймами данных - PullRequest
0 голосов
/ 15 сентября 2018

Есть ли надежный способ предсказать, какие операции с кадрами данных Spark сохранят разбиение, а какие нет?

В частности, скажем, все мои фреймы данных разделены на .repartition (500, 'field1', 'field2'). Могу ли я ожидать вывод с 500 разделами, расположенными по тем же полям, если я применю:

  1. выберите ()
  2. фильтр ()
  3. groupBy (), за которым следует agg (), когда группировка происходит по 'field1' и 'field2' (как показано выше)
  4. join () для 'field1' и 'field2', когда оба кадра данных разделены, как указано выше

Учитывая особый способ подготовки моих данных, я бы не ожидал, что произойдет дополнительная перестановка. Тем не менее, мне всегда кажется, что по крайней мере несколько этапов имеют количество задач, равное spark.sql.shuffle.partitions. Есть ли способ избежать этой дополнительной биты?

Спасибо

1 Ответ

0 голосов
/ 15 сентября 2018

Это хорошо известная проблема с искрой.Даже если вы произвели повторное разбиение, искра данных будет перетасовывать данные.

В чем проблема

Повторный раздел гарантирует, что каждый раздел содержит данные об одном значении столбца.

Хороший пример здесь:

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, в котором для определения разбиения данных используются сегменты и сегментированные столбцы.

Мотивация состоит в том, чтобы оптимизировать производительность запроса на соединение, избегая перемешиваний (иначе называемых обменами).) таблиц, участвующих в объединении.Группировка приводит к меньшему количеству обменов (и т. Д. Этапов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...