我正在使用pyspark,并且我有一个大型数据源,我想要显式地指定每个分区中的文件大小来重新分区。
我知道使用repartition(500)
函数将把我的parquet文件分成500个几乎相等大小的文件。
问题是每天都会向这个数据源添加新数据。有些天可能有大量输入,有些天可能有较小的输入。因此,在一段时间内查看分区文件大小分布时,每个文件的大小在200KB到700KB之间变化。
我考虑指定每个分区的最大大小,以便每天获得更或多或少相同大小的文件,不管文件数目。 这将帮助我在稍后运行我的大型数据集的作业时避免执行时间和洗牌时间等方面的倾斜。
是否有一种方法可以在使用repartition()
函数或将数据框写入parquet时指定它?
maxRecordsPerFile
设置为正确的值,对吗? 难道没有直接指定文件最大大小的方法吗? - thentanglerStorageLevel.MEMORY_AND_DISK
。简单地说,在结果完全写入磁盘之前,无法估计写入过程中文件的实际大小。 - Scott HsiehgetByte(df.head())
,但它在pyspark中没有起作用。 - thentangler.repartition(8)
写出了一个结果,抓住其中一个 8 个文件之一,假设你的结果中有 5 列且这些列是固定的,即无论生成多少分区(文件),总会有 5 列。 在这种情况下,你可以得到 5 列行的平均大小,然后可以暂时确定一个大致的maxRecordsPerFile
数量。 核心思想是尽可能地接近你结果的数据分布。 - Scott Hsieh