Відповідь Джастіна приголомшлива, і ця відповідь заглиблюється в більш глибоку.
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
.