写入镶木地板时,Apache Spark数据帧不会重新分区

时间:2019-07-19 12:11:55

标签: scala apache-spark

我正在尝试对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个分区。

有人知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:0)

首先,您不应提供parquet()方法的文件路径,而应提供文件夹。 Spark将自行处理实木复合地板文件名。

然后,您必须意识到coalesce减少分区的数量(无随机播放),而repartition则允许您将DataFrame重新分区(无随机播放)您需要的任何数量的分区(或多或少)。有关repartitioncoalesce的更多详细信息,请查看this SO问题。

根据您的情况,您想增加分区数,因此需要使用repartition

df.repartition(20).write.parquet("/path/to/folder")