Databricks使用overwrite模式写入Delta分区表时覆盖全表问题
问题解答
你的理解不正确,默认使用overwrite模式写入Delta分区表时,默认行为就是全表覆盖,仅覆盖对应分区需要额外开启相关配置。
全表覆盖的原因
Delta Lake沿用了Spark原生的写入语义,默认情况下SaveMode.Overwrite的逻辑是:删除目标表的所有现有数据,再将当前DataFrame的全量数据写入表中,和是否设置分区写入没有关联。
实现仅覆盖匹配分区的方法
如果需要仅覆盖当前DataFrame中存在的分区,保留其他分区的数据,需要开启动态分区覆盖配置,有两种生效方式:
- 单作业生效:写入时增加
partitionOverwriteMode参数设置,示例代码如下:
df .write .partitionBy("dt") .mode("overwrite") .format("delta") .option("partitionOverwriteMode", "dynamic") .saveAsTable("db.customer_history")
- 全局会话生效:在Spark会话初始化时配置参数,后续所有写入作业自动生效:
SET spark.sql.sources.partitionOverwriteMode = dynamic;
注意事项
- 开启动态分区覆盖后,只会覆盖当前DataFrame中包含的分区列值对应的分区,未匹配到的分区数据会完整保留。
- 写入的DataFrame必须包含分区列(本例中为
dt),否则仍会触发全表覆盖。
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

