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

问题描述 投票:0回答:4

如果我写

dataFrame.write.format("parquet").mode("append").save("temp.parquet")

在 temp.parquet 文件夹中 我得到与行号相同的文件号

我想我并不完全了解镶木地板,但它是自然的吗?

scala apache-spark parquet
4个回答
29
投票

write

操作之前使用
coalesce

dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")


编辑-1

仔细观察后,docs确实警告了

coalesce

但是,如果您正在进行剧烈合并,例如至 numPartitions = 1,这可能会导致您的计算在更少的节点上进行 比您喜欢的多(例如,在 numPartitions = 1 的情况下只有一个节点)

因此,正如@Amar建议的,最好使用

repartition


16
投票

可以将分区设置为1来保存为单个文件

dataFrame.repartition(1).write.format("parquet").mode("append").save("temp.parquet")

6
投票

尽管以前的答案是正确的,但您必须了解重新分区或合并到单个分区后产生的影响。您的所有数据都必须传输到单个工作人员才能立即将其写入单个文件。

正如互联网上反复提到的那样,尽管随机步骤已添加到执行计划中,但在这种情况下您应该使用

repartition
。此步骤有助于使用集群的功能,而不是按顺序合并文件。

至少有一个替代方案值得一提。您可以编写一个简单的脚本,将所有文件合并为一个文件。这样您就可以避免为集群的单个节点生成大量网络流量。


0
投票

上面的 ans 是正确的,但是如果我们有非常大的数据而不是 colease,并且如果数据量比重新分区小,则您可以使用 repartition 和 colease 两者都取决于数据分区和数据大小

© www.soinside.com 2019 - 2024. All rights reserved.