如何控制使用 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 中的随机播放和连接。
partitionBy
在 DataFrameWriter
(你移动
从 DataFrame
到 DataFrameWriter
一旦你调用 write
) 只是对之前的分区数进行操作。 (作者的partitionBy
只是给即将写出的table/parquet文件分配了columns,所以跟partitions的个数没有关系,有点迷惑。)
长话短说,只是 repartition
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个小的parquet文件,总共写入了大约80000个parquet文件。由于多种原因,这不是最佳选择,我想避免这种情况。
我当然可以将 spark.sql.shuffle.partitions
设置为更小的数字,比如 10,但据我了解,此设置还控制了连接和聚合中洗牌的分区数,所以我真的不知道想改变这个。
有谁知道有没有其他方法可以控制写入多少文件?
正如您正确指出的那样,spark.sql.shuffle.partitions
仅适用于 SparkSQL 中的随机播放和连接。
partitionBy
在 DataFrameWriter
(你移动
从 DataFrame
到 DataFrameWriter
一旦你调用 write
) 只是对之前的分区数进行操作。 (作者的partitionBy
只是给即将写出的table/parquet文件分配了columns,所以跟partitions的个数没有关系,有点迷惑。)
长话短说,只是 repartition
DataFrame
在你把它变成作家之前。