Ответ Джастина потрясающий, и этот ответ углубляется.
repartitionАлгоритм делает полный перетасовать и создает новые разделы с данными, распределенными равномерно. Давайте создадим DataFrame с номерами от 1 до 12.
val x = (1 to 12).toList
val numbersDf = x.toDF("number")
numbersDf содержит 4 раздела на моей машине.
numbersDf.rdd.partitions.size // => 4
Вот как данные делятся на разделы:
Partition 00000: 1, 2, 3
Partition 00001: 4, 5, 6
Partition 00002: 7, 8, 9
Partition 00003: 10, 11, 12
Давайте сделаем полное перемешивание с repartitionметодом и получим эти данные на двух узлах.
val numbersDfR = numbersDf.repartition(2)
Вот как numbersDfRданные разделены на моей машине:
Partition A: 1, 3, 4, 6, 7, 9, 10, 12
Partition B: 2, 5, 8, 11
repartitionМетод делает новые разделы и равномерно распределяет данные в новых разделах (распределение данных больше даже для больших наборов данных).
Разница между coalesceиrepartition
coalesceиспользует существующие разделы, чтобы минимизировать объем перемешиваемых данных. repartitionсоздает новые разделы и делает полное перемешивание. coalesceприводит к разделам с различными объемами данных (иногда разделам, которые имеют очень разные размеры) и repartitionприводит к разделам примерно одинакового размера.
Есть coalesceили repartitionбыстрее?
coalesceможет работать быстрее, чем repartition, но разделы неравного размера обычно работают медленнее, чем разделы равного размера. Обычно вам необходимо перераспределить наборы данных после фильтрации большого набора данных. Я обнаружил, что repartitionв целом быстрее, потому что Spark создан для работы с разделами одинакового размера.
NB Я с любопытством заметил, что перераспределение может увеличить размер данных на диске . Обязательно запускайте тесты, когда вы используете перераспределение / объединение больших наборов данных.
Прочтите этот пост в блоге, если вы хотите еще больше деталей.
Когда вы будете использовать коалесценцию и передел на практике
minimize data movementа неavoiding data movement.