Spark Job 卡住了将数据帧写入分区 Delta 表

Posted

技术标签:

【中文标题】Spark Job 卡住了将数据帧写入分区 Delta 表【英文标题】:Spark Job stuck writing dataframe to partitioned Delta table 【发布时间】:2021-11-10 18:24:56 【问题描述】:

运行数据块以读取 csv 文件,然后保存为分区增量表。

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

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

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

【问题讨论】:

这里的答案非常有用。 ***.com/questions/60512207/… 【参考方案1】:

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

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

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

【讨论】:

以上是关于Spark Job 卡住了将数据帧写入分区 Delta 表的主要内容,如果未能解决你的问题,请参考以下文章

将 Spark 数据帧写入带分区的 CSV

Apache Spark 数据帧在写入镶木地板时不会重新分区

获取 Spark 写入 Hive 元存储的所有新分区

Spark中转换的失败处理

从 spark(2.11) 数据帧写入 hive 分区表时出现 org.apache.hadoop.hive.ql.metadata.Hive.loadDynamicPartitions 异常

将 PySpark 数据帧写入分区 Hive 表