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

Gle*_*olt 8 apache-spark spark-dataframe

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

dataframe
  .write
  .mode(SaveMode.Append)
  .partitionBy("year", "month", "date", "country", "predicate")
  .parquet(outputPath)
Run Code Online (Sandbox Code Playgroud)

partitionBy数据拆分成相当多的文件夹(~400),每个文件夹只有一点点数据(~1GB).这就出现了问题 - 因为默认值为spark.sql.shuffle.partitions200,每个文件夹中的1GB数据被分成200个小的镶木地板文件,导致总共写入大约80000个镶木地板文件.由于多种原因,这不是最佳的,我想避免这种情况.

我当然可以设置spark.sql.shuffle.partitions一个更小的数字,比如说10,但据我所知,这个设置也控制了连接和聚合中shuffle的分区数,所以我真的不想改变它.

有谁知道是否有另一种方法来控制写入多少文件?

Mar*_*ier 6

正如您所指出的那样,spark.sql.shuffle.partitions仅适用于SparkSQL中的shuffle和join.

partitionByin DataFrameWriter(从调用后一直移动DataFrame到)只需对前一个分区进行操作即可.(作者只会将列分配给将要写出的表/镶木地板文件,因此它与分区数无关.这有点令人困惑.)DataFrameWriterwritepartitionBy

长话短说,只是repartitionDataFrame你把它转换成一个作家了.