8

DataFrame特定のパーティショニングに従って S3 に書き込む必要があります。コードは次のようになります。

dataframe
  .write
  .mode(SaveMode.Append)
  .partitionBy("year", "month", "date", "country", "predicate")
  .parquet(outputPath)

データをかなり多数のpartitionByフォルダー (~400) に分割し、それぞれにほんの少しのデータ (~1GB) を入れます。ここで問題が発生します。デフォルト値spark.sql.shuffle.partitionsは 200 であるため、各フォルダー内の 1GB のデータは 200 個の小さな寄木細工ファイルに分割され、合計で約 80000 個の寄木細工ファイルが書き込まれます。これは多くの理由で最適ではなく、回避したいと考えています。

もちろん、spark.sql.shuffle.partitionsを 10 などのはるかに小さい数に設定することもできますが、この設定は、結合と集計のシャッフルのパーティション数も制御することを理解しているため、これを変更したくありません。

書き込まれるファイルの数を制御する別の方法があるかどうかは誰にもわかりませんか?

4

1 に答える 1

7

ご指摘のとおりspark.sql.shuffle.partitions、SparkSQL のシャッフルと結合にのみ適用されます。

partitionByin DataFrameWriter( を呼び出すとすぐにからDataFrameに移動します) は、以前の数のパーティションに対して単純に動作します。(ライターは、書き出されるテーブル/寄木細工ファイルに列を割り当てるだけなので、パーティションの数とは関係ありません。これは少し混乱します。)DataFrameWriterwritepartitionBy

簡単に言えば、ライターに変換する直前ですrepartitionDataFrame

于 2015-11-20T14:15:52.040 に答える