Spark 只保存(写入)parquet 一个文件
Spark save(write) parquet only one file
如果我写
dataFrame.write.format("parquet").mode("append").save("temp.parquet")
在 temp.parquet 文件夹中
我得到了与行号相同的文件号
我想我对镶木地板不是很了解,但它是天然的吗?
您可以将分区设置为1个以保存为单个文件
dataFrame.repartition(1).write.format("parquet").mode("append").save("temp.parquet")
在写入操作前使用coalesce
dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")
EDIT-1
仔细观察,docs 确实警告 coalesce
However, if you're doing a drastic coalesce, e.g. to numPartitions =
1, this may result in your computation taking place on fewer nodes
than you like (e.g. one node in the case of numPartitions = 1)
因此, it's better to use repartition
尽管之前的答案是正确的,但您必须了解重新分区或合并到单个分区后的影响。您的所有数据都必须传输给单个工作人员,以便立即将其写入单个文件。
正如整个 Internet 上反复提到的那样,在这种情况下您应该使用 repartition
,尽管随机步骤已添加到执行计划中。此步骤有助于使用集群的强大功能,而不是按顺序合并文件。
至少有一个备选方案值得一提。您可以编写一个简单的脚本,将所有文件合并为一个文件。这样您就可以避免向集群的单个节点生成大量网络流量。
如果我写
dataFrame.write.format("parquet").mode("append").save("temp.parquet")
在 temp.parquet 文件夹中 我得到了与行号相同的文件号
我想我对镶木地板不是很了解,但它是天然的吗?
您可以将分区设置为1个以保存为单个文件
dataFrame.repartition(1).write.format("parquet").mode("append").save("temp.parquet")
在写入操作前使用coalesce
dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")
EDIT-1
仔细观察,docs 确实警告 coalesce
However, if you're doing a drastic coalesce, e.g. to numPartitions = 1, this may result in your computation taking place on fewer nodes than you like (e.g. one node in the case of numPartitions = 1)
因此repartition
尽管之前的答案是正确的,但您必须了解重新分区或合并到单个分区后的影响。您的所有数据都必须传输给单个工作人员,以便立即将其写入单个文件。
正如整个 Internet 上反复提到的那样,在这种情况下您应该使用 repartition
,尽管随机步骤已添加到执行计划中。此步骤有助于使用集群的强大功能,而不是按顺序合并文件。
至少有一个备选方案值得一提。您可以编写一个简单的脚本,将所有文件合并为一个文件。这样您就可以避免向集群的单个节点生成大量网络流量。