如果我写
dataFrame.write.format("parquet").mode("append").save("temp.parquet")
字符串在临时.parquet文件夹我得到了相同的文件编号作为行号我想我不是很了解 parquet ,但是它是天然吗?
ht4b089n1#
在 write 操作之前使用coalescedataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")个
coalesce
dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")
编辑-1
仔细一看,文档确实警告了coalesce然而,如果你正在进行剧烈的合并,例如numPartitions = 1,这可能会导致你的计算发生在比你想要的更少的节点上(例如,在numPartitions = 1的情况下只有一个节点)。因此,作为suggested by @Amar,最好使用repartition
repartition
w9apscun2#
您可以将分区设置为1以保存为单个文件
dataFrame.repartition(1).write.format("parquet").mode("append").save("temp.parquet")
字符串
bwitn5fc3#
虽然前面的答案是正确的,但您必须了解重新分区或合并到单个分区后的重新分配。所有数据都必须传输到单个工作进程,以便立即将其写入单个文件。正如互联网上反复提到的那样,在这种情况下,你应该使用repartition,尽管在执行计划中添加了shuffle步骤。这一步骤有助于使用集群的能力,而不是顺序合并文件。至少有一种替代方案值得一提。您可以编写一个简单的脚本,将所有文件合并到一个文件中。这样您就可以避免向集群的单个节点生成大量网络流量。
3条答案
按热度按时间ht4b089n1#
在 write 操作之前使用
coalesce
dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")
个编辑-1
仔细一看,文档确实警告了
coalesce
然而,如果你正在进行剧烈的合并,例如numPartitions = 1,这可能会导致你的计算发生在比你想要的更少的节点上(例如,在numPartitions = 1的情况下只有一个节点)。
因此,作为suggested by @Amar,最好使用
repartition
w9apscun2#
您可以将分区设置为1以保存为单个文件
字符串
bwitn5fc3#
虽然前面的答案是正确的,但您必须了解重新分区或合并到单个分区后的重新分配。所有数据都必须传输到单个工作进程,以便立即将其写入单个文件。
正如互联网上反复提到的那样,在这种情况下,你应该使用
repartition
,尽管在执行计划中添加了shuffle步骤。这一步骤有助于使用集群的能力,而不是顺序合并文件。至少有一种替代方案值得一提。您可以编写一个简单的脚本,将所有文件合并到一个文件中。这样您就可以避免向集群的单个节点生成大量网络流量。