Ответ Джастина потрясающий, и этот ответ углубляется.
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
.