如果我写
dataFrame.write.format("parquet").mode("append").save("temp.parquet")
在temp.parquet文件夹中,我得到了与行数相同的文件编号。
我觉得我对parquet还不是很理解,这是否正常?
如果我写
dataFrame.write.format("parquet").mode("append").save("temp.parquet")
在temp.parquet文件夹中,我得到了与行数相同的文件编号。
我觉得我对parquet还不是很理解,这是否正常?
在进行写入操作之前,请使用coalesce
函数。
dataFrame.coalesce(1).write.format("parquet").mode("append").save("temp.parquet")
编辑-1
仔细查看文档后,发现文档确实警告了coalesce
然而,如果你进行了大量的合并操作,例如将numPartitions=1,则可能会导致计算在比你所希望的更少的节点上执行(例如,在numPartitions=1的情况下,在一个节点上执行)
因此,正如@Amar建议的那样, 最好使用repartition
您可以将分区设置为1,以保存为单个文件
dataFrame.repartition(1).write.format("parquet").mode("append").save("temp.parquet")
coalesce
最小化数据移动,但生成的分区不一定(实际上很少)是相同大小,因此这实际上是在少量洗牌开销和(几乎)等大小的分区之间进行权衡。**[1]** 因此,通常情况下,最好使用coalesce
,只有在观察到退化时才回退到repartition
[2] 但是,在numPartitions=1
的特定情况下,文档强调repartition
是更好的选择。 - y2k-shubham