scala Spark保存(写入)parquet仅一个文件

8ehkhllq  于 5个月前  发布在  Scala
关注(0)|答案(3)|浏览(78)

如果我写

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

字符串
在临时.parquet文件夹我得到了相同的文件编号作为行号
我想我不是很了解 parquet ,但是它是天然吗?

ht4b089n

ht4b089n1#

write 操作之前使用coalesce
dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")

编辑-1

仔细一看,文档确实警告了coalesce
然而,如果你正在进行剧烈的合并,例如numPartitions = 1,这可能会导致你的计算发生在比你想要的更少的节点上(例如,在numPartitions = 1的情况下只有一个节点)。
因此,作为suggested by @Amar,最好使用repartition

w9apscun

w9apscun2#

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

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

字符串

bwitn5fc

bwitn5fc3#

虽然前面的答案是正确的,但您必须了解重新分区或合并到单个分区后的重新分配。所有数据都必须传输到单个工作进程,以便立即将其写入单个文件。
正如互联网上反复提到的那样,在这种情况下,你应该使用repartition,尽管在执行计划中添加了shuffle步骤。这一步骤有助于使用集群的能力,而不是顺序合并文件。
至少有一种替代方案值得一提。您可以编写一个简单的脚本,将所有文件合并到一个文件中。这样您就可以避免向集群的单个节点生成大量网络流量。

相关问题