Spark保存(写入)实木复合地板仅一个文件

时间:2018-08-01 08:44:55

标签: scala apache-spark parquet

如果我写

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

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

我认为我对镶木地板不是很了解,但这很自然吗?

3 个答案:

答案 0 :(得分:2)

写入操作之前使用coalesce

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


EDIT-1

仔细观察,docs会警告coalesce

  

但是,如果您要进行剧烈的合并,例如到numPartitions =   1,这可能导致您的计算在更少的节点上进行   超过您的期望(例如,在numPartitions = 1的情况下为一个节点)

因此,作为suggested by @Amar,最好使用repartition

答案 1 :(得分:2)

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

正如在互联网上反复提到的那样,尽管在执行方案中增加了改组步骤,但在这种情况下仍应使用repartition。此步骤有助于使用群集的功能,而不是按顺序合并文件。

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

答案 2 :(得分:1)

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

dataFrame.write.repartitions(1).format("parquet").mode("append").save("temp.parquet")
相关问题