特定のパーティションに従ってS3に書き込む必要があるDataFrame
があります。コードは次のようになります。partitionByを使用して生成された寄木細工ファイルの数を制御する方法
dataframe
.write
.mode(SaveMode.Append)
.partitionBy("year", "month", "date", "country", "predicate")
.parquet(outputPath)
partitionBy
は、それぞれのデータのほんの少し(〜1ギガバイト)でフォルダのかなり大きな数(〜400)にデータを分割します。 spark.sql.shuffle.partitions
のデフォルト値が200であるため、各フォルダ内の1GBのデータは200個の小さな寄木張りファイルに分割され、合計で80000個の寄木張りファイルが作成されます。これはいくつかの理由で最適ではないので、私はこれを避けたいと思います。
もちろん、spark.sql.shuffle.partitions
のほうがはるかに小さい数字に設定することもできますが、この設定ではジョインと集約のシャッフル用のパーティション数も制御されるため、これを変更したくありません。
書き込まれるファイルの数を制御する別の方法があるかどうか知りませんか?
'.write'の前にデータフレームを再分割しましたか?一見、 'spark.sql.shuffle.partitions'はシャッフルとジョインでのみ使用されているようですが、それ以外はどこにもありません。それ以外の場合は、partitionByの追加の 'numParameter'パラメータのチケットを開く必要があります。 –
@MariusSoutier Hmmm ... 'repartition'を' write before'と呼ぶと元の 'dataframe'が' partitionBy'関数で再分割される前に再分割されると思います。オリジナルのデータフレームをわずか10個のパーティションに再分割すると、間違いなくOOM例外が発生します。しかし、私は今それをテストする仕事を始めました。私は更新が完了したらすぐに取り返します。 –
@MariusSoutier作品です!素晴らしい。ありがとうございました!あなたは返信としてそれを投稿したいですか?それから私はそれを答えたようにマークします:-) –