DataFrame repartition()
とDataFrameWriter partitionBy()メソッドの違いは何ですか?Spark SQL - df.repartitionとDataFrameWriterパーティションの違い?
私は両方ともpartition data based on DF column
に使用されることを願っていますか?または何か違いがありますか?
DataFrame repartition()
とDataFrameWriter partitionBy()メソッドの違いは何ですか?Spark SQL - df.repartitionとDataFrameWriterパーティションの違い?
私は両方ともpartition data based on DF column
に使用されることを願っていますか?または何か違いがありますか?
repartition(COL)
を実行すると、計算中にパーティション分割を変更すると、spark.sql.shuffle.partitions
(デフォルト:200)のパーティションが得られます。 .write
に電話すると、多数のファイルを含む1つのディレクトリが作成されます。
.write.partitionBy(COL)
を実行すると、結果としてCOL内に一意の値として表示されるディレクトリ数が増えます。これにより、データの読み込み速度が向上します(パーティション化の列でフィルタリングした場合)。ストレージにスペースを確保します(パーティション化された列はデータファイルから削除されます)。
気をつけてください:私は受け入れられた答えが間違っていると信じています!これらの同様の名前の関数の動作は、公式のスパークの文書ではよく説明されていない重要かつ予想外の方法で異なるため、この質問をしてうれしいです。
受け入れられた回答の最初の部分は正しいです: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個のパーティションはそれぞれ、「日」列で別々にサブパーティション化され、各サブパーティションごとに別々のファイルが書き込まれます。
私はこの動作が面倒で、データフレームを書き込むときにグローバルなパーティション分割を行う方法があることを望んでいます。