首页 > 解决方案 > 如何在 spark 中使用 repartition() 指定文件大小

问题描述

我使用 pyspark 并且我有一个大型数据源,我想重新分区,明确指定每个分区的文件大小。

我知道使用该repartition(500)功能会将我的镶木地板分成 500 个大小几乎相等的文件。问题是每天都会有新数据添加到这个数据源中。在某些日子可能会有很大的输入,而在某些日子可能会有较小的输入。因此,当查看一段时间内的分区文件大小分布时,它会因200KB文件而异700KB

我正在考虑指定每个分区的最大大小,以便我每天获得每个文件或多或少相同的文件大小,而与文件数量无关。这将有助于我稍后在这个大型数据集上运行我的工作,以避免扭曲的执行器时间和洗牌时间等。

有没有办法使用repartition()函数或在将数据框写入镶木地板时指定它?

标签: apache-sparkpysparkparquetpartitioning

解决方案


您可以考虑使用参数编写结果maxRecordsPerFile

storage_location = //...
estimated_records_with_desired_size = 2000
result_df.write.option(
     "maxRecordsPerFile", 
     estimated_records_with_desired_size) \
     .parquet(storage_location, compression="snappy")

推荐阅读