2016-11-04 4 views

答えて

1

repartition(COL)を実行すると、計算中にパーティション分割を変更すると、spark.sql.shuffle.partitions(デフォルト:200)のパーティションが得られます。 .writeに電話すると、多数のファイルを含む1つのディレクトリが作成されます。

.write.partitionBy(COL)を実行すると、結果としてCOL内に一意の値として表示されるディレクトリ数が増えます。これにより、データの読み込み速度が向上します(パーティション化の列でフィルタリングした場合)。ストレージにスペースを確保します(パーティション化された列はデータファイルから削除されます)。

12

気をつけてください:私は受け入れられた答えが間違っていると信じています!これらの同様の名前の関数の動作は、公式のスパークの文書ではよく説明されていない重要かつ予想外の方法で異なるため、この質問をしてうれしいです。

受け入れられた回答の最初の部分は正しいです:df.repartition(COL, numPartitions=k)を呼び出すと、ハッシュベースのパーティショナーを使用してkのパーティションのデータフレームが作成されます。 COLは、パーティション化キーを定義します。これは、単一の列または列のリストです。ハッシュベースのパーティショナーは、各入力行のパーティションキーを取り、partition = hash(partitionKey) % kのようなものを介してkパーティションのスペースにハッシュします。これにより、同じパーティションキーを持つすべての行が同じパーティション内で終了することが保証されます。ただし、の複数のパーティションキーからの行は、同じパーティションにも終わる可能性があります。(パーティションキー間でハッシュコリジョンが発生した場合)およびパーティションが空になる可能性があります。要約すると

df.repartition(COL, numPartitions=k)の直感的な側面は

  • パーティションは厳密に他の人が複数のパーティション・キー
  • から行を含むことができ、一方、あなたの kパーティションのいくつかは、空であってもよいパーティション・キー
  • を分離しないことです

多くのユーザーが期待しないように、df.write.partitionByの動作は全く異なります。出力ファイルを日付区切りにして、データが7日間に渡るようにしたいとしましょう。また、dfには10個のパーティションがあるとします。 df.write.partitionBy('day')を実行すると、いくつの出力ファイルが必要ですか?答えは「それに依存する」です。開始パーティションの各パーティションにdfのデータが含まれている場合は、回答は70です。dfの開始パーティションには正確に1日のデータが含まれている場合、答えは10です。

この行動は? df.writeを実行すると、元のパーティションのそれぞれがdfに書き込まれます。つまり、元の10個のパーティションはそれぞれ、「日」列で別々にサブパーティション化され、各サブパーティションごとに別々のファイルが書き込まれます。

私はこの動作が面倒で、データフレームを書き込むときにグローバルなパーティション分割を行う方法があることを望んでいます。

関連する問題