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

Posted

技术标签:

【中文标题】Apache Spark 数据帧在写入镶木地板时不会重新分区【英文标题】:Apache Spark dataframe does not repartition while writing to parquet 【发布时间】:2019-07-19 12:11:55 【问题描述】:

我正在尝试对我的 DataFrame 进行分区并将其写入 parquet 文件。在我看来,重新分区适用于内存中的数据帧,但不影响镶木地板分区。更奇怪的是,coalesce 起作用了。假设我有 DataFrame df:

df.rdd.partitions.size
4000
var df_new = df.repartition(20)
df_new.rdd.partitions.size
20

但是,当我尝试编写 parquet 文件时,我得到以下信息:

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】:

首先,您不应该提供parquet() 方法的文件路径,而是提供文件夹。 Spark 将自行处理 parquet 文件名。

然后,您必须知道coalesce减少分区数量(无随机播放),而repartition 允许您在任意数量的分区中重新分区(使用随机播放)您的 DataFrame你需要(或多或少)。查看this SO 问题以了解有关repartitioncoalesce 的更多详细信息。

在你的情况下,你想增加分区的数量,所以你需要使用repartition

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

【讨论】:

以上是关于Apache Spark 数据帧在写入镶木地板时不会重新分区的主要内容,如果未能解决你的问题,请参考以下文章

将大型 Spark 数据帧作为镶木地板写入 s3 存储桶

镶木地板写入期间的 Spark ClosedChannelException 异常

Spark保存(写入)镶木地板只有一个文件

在 Spark 2.0 中从 AVRO 写入镶木地板时出现 NullPointerException

Spark - 如果已经存在,则更新记录(在镶木地板文件中)

如何使用镶木地板在火花中读取和写入同一个文件?