我有一个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的分区数,所以我真的不是想要改变这一点。
有没有人知道是否有另一种方法可以控制写入多少文件?
答案 0 :(得分:6)
正如您所指出的那样,spark.sql.shuffle.partitions
仅适用于SparkSQL中的shuffle和join。
partitionBy
中的 DataFrameWriter
(你移动
从DataFrame
到DataFrameWriter
,只要您调用write
),就可以对前一个分区进行操作。 (作者的partitionBy
只将列分配给将要写出的表/镶木地板文件,因此它与分区数无关。这有点令人困惑。)
长话短说,只有repartition
DataFrame
才能将其转换为作家。