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 问题以了解有关repartition
与coalesce
的更多详细信息。
在你的情况下,你想增加分区的数量,所以你需要使用repartition
df.repartition(20).write.parquet("/path/to/folder")
【讨论】:
以上是关于Apache Spark 数据帧在写入镶木地板时不会重新分区的主要内容,如果未能解决你的问题,请参考以下文章
镶木地板写入期间的 Spark ClosedChannelException 异常
在 Spark 2.0 中从 AVRO 写入镶木地板时出现 NullPointerException