Відповідь Джастіна приголомшлива, і ця відповідь заглиблюється в більш глибоку.
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 створений для роботи з розділами однакового розміру.
Примітка: Я з цікавістю зазначив, що переділ може збільшити розмір даних на диску . Не забудьте запустити тести, коли ви використовуєте переділ / злиття на великих наборах даних.
Прочитайте цю публікацію в блозі, якщо хочете ще більше деталей.
Коли ви будете використовувати coalesce і переділ на практиці
minimize data movementзамістьavoiding data movement.