ジャスティンの答えは素晴らしいです、そして、この反応はより深く入ります。
repartition
このアルゴリズムは、完全なシャッフルを行い、均等に分散のデータを使用して新しいパーティションを作成します。1から12までの数字でDataFrameを作成しましょう。
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
メソッドでフルシャッフルを行い、このデータを2つのノードで取得します。
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は同じサイズのパーティションで動作するように構築されているため、全体的に高速であることがわかりました。
注意:不思議なことに、パーティションを分割するとディスク上のデータのサイズが増加する可能性があることに気付きました。大きなデータセットでrepartition /合体を使用している場合は、必ずテストを実行してください。
詳細については、このブログ投稿をご覧ください。
実際に合体と再分割を使用する場合
minimize data movement
代わりに言ったほうがいいでしょうavoiding data movement
。