8

我有一个DataFrame需要根据特定分区写入 S3 的内容。代码如下所示:

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

partitionBy数据拆分为相当多的文件夹(~400),每个文件夹只有一点点数据(~1GB)。问题来了——因为默认值为spark.sql.shuffle.partitions200,每个文件夹中1GB的数据被分割成200个parquet小文件,总共写入了大约80000个parquet文件。由于多种原因,这不是最佳选择,我想避免这种情况。

我当然可以将 设置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 回答