如何控制使用 partitionBy 时生成的镶木地板文件的数量

How to control number of parquet files generated when using partitionBy

我有一个 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个小的parquet文件,总共写入了大约80000个parquet文件。由于多种原因,这不是最佳选择,我想避免这种情况。

我当然可以将 spark.sql.shuffle.partitions 设置为更小的数字,比如 10,但据我了解,此设置还控制了连接和聚合中洗牌的分区数,所以我真的不知道想改变这个。

有谁知道有没有其他方法可以控制写入多少文件?

正如您正确指出的那样,spark.sql.shuffle.partitions 仅适用于 SparkSQL 中的随机播放和连接。

partitionByDataFrameWriter(你移动 从 DataFrameDataFrameWriter 一旦你调用 write) 只是对之前的分区数进行操作。 (作者的partitionBy只是给即将写出的table/parquet文件分配了columns,所以跟partitions的个数没有关系,有点迷惑。)

长话短说,只是 repartition DataFrame 在你把它变成作家之前。