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

时间:2015-11-20 09:29:26

标签: apache-spark spark-dataframe

我有一个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,但据我所知,此设置还控制了连接和聚合中shuffle的分区数,所以我真的不是想要改变这一点。

有没有人知道是否有另一种方法可以控制写入多少文件?

1 个答案:

答案 0 :(得分:6)

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

partitionBy中的

DataFrameWriter(你移动 从DataFrameDataFrameWriter,只要您调用write),就可以对前一个分区进行操作。 (作者的partitionBy只将列分配给将要写出的表/镶木地板文件,因此它与分区数无关。这有点令人困惑。)

长话短说,只有repartition DataFrame才能将其转换为作家。