我正在尝试对DataFrame进行分区并将其写入镶木地板文件中。在我看来,重新分区适用于内存中的数据帧,但不影响实木复合地板分区。合并的作用更加奇怪。可以说我有DataFrame df:
df.rdd.partitions.size
4000
var df_new = df.repartition(20)
df_new.rdd.partitions.size
20
但是,当我尝试编写实木复合地板文件时,得到以下信息:
df_new.write.parquet("test.paruqet")
[Stage 0:> (0 + 8) / 4000]
这将创建4000个文件,但是,如果执行此操作,则会得到以下信息:
var df_new = df.coalesce(20)
df_new.write.parquet("test.paruqet")
[Stage 0:> (0 + 8) / 20]
我可以得到减少分区的数量。问题是当我需要增加分区数量时,我无法做到。就像我有8个分区,然后尝试将其增加到100个一样,它总是只写8个分区。
有人知道如何解决此问题吗?
答案 0 :(得分:0)
首先,您不应提供parquet()
方法的文件路径,而应提供文件夹。 Spark将自行处理实木复合地板文件名。
然后,您必须意识到coalesce
仅减少分区的数量(无随机播放),而repartition
则允许您将DataFrame重新分区(无随机播放)您需要的任何数量的分区(或多或少)。有关repartition
与coalesce
的更多详细信息,请查看this SO问题。
根据您的情况,您想增加分区数,因此需要使用repartition
df.repartition(20).write.parquet("/path/to/folder")