如何在spark中使用repartition()指定文件大小

the*_*ler 7 partitioning apache-spark parquet pyspark

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

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

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

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

Sco*_*ieh 5

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

storage_location = //...
estimated_records_with_desired_size = 2000
result_df.write.option(
     "maxRecordsPerFile", 
     estimated_records_with_desired_size) \
     .parquet(storage_location, compression="snappy")
Run Code Online (Sandbox Code Playgroud)

  • 但要做到这一点,我首先需要找出 100MB 文件中有多少条记录,然后将 maxRecordsPerFile 设置为正确的值?有没有办法直接指定文件的最大大小? (2认同)