首页 > 解决方案 > Spark Job 卡住了将数据帧写入分区 Delta 表

问题描述

运行 databricks 读取 csv 文件,然后保存为分区增量表。

文件中的总记录为 179619219 。它在 COL A(8419 个唯一值)和年份(10 年)和月份上进行拆分。

df.write.partitionBy("A","year","month").format("delta").mode("append").save(path)

作业卡在写入步骤并在运行 5-6 小时后中止

标签: pythonapache-sparkpysparkazure-databricksdelta-lake

解决方案


这是非常糟糕的分区模式。您只是为 column 拥有太多唯一值A,并且额外的分区正在创建更多分区。Spark 需要创建至少 90k 个分区,这将需要创建单独的文件(小)等。小文件会损害性能。

对于非Delta表,分区主要用于在读取数据时进行数据跳过。但是对于 Delta 湖表,分区可能并不那么重要,因为 Databricks 上的 Delta 包括诸如数据跳过之类的东西,您可以应用ZOrder等。

我建议使用不同的分区模式,例如,仅year+ ,并在写入数据后在列month上使用 ZOrder 进行 OPTIMIZE 。A这将导致仅创建少数具有较大文件的分区。


推荐阅读