Spark SQL MERGE语句重复执行为何意外插入行而非仅更新?
问题分析与解答
你的MERGE语句语法本身没有问题——因为你只定义了WHEN MATCHED THEN UPDATE分支,完全没有包含WHEN NOT MATCHED THEN INSERT逻辑,所以这条语句绝对不会触发插入操作。
可能的原因排查
- 如果你说的是目标表
my_db.my_table出现额外行:- 大概率是你的
change_table中存在未匹配目标表的行,但这条MERGE不会处理这些行,除非你有其他并行的插入逻辑在运行。 - 检查
change_table的SYS_CHANGE_OPERATION字段,是不是混入了'I'(插入类型)的行,且有其他代码在处理这些插入型变更。
- 大概率是你的
- 如果你确实是指
change_table出现额外行:- 这和这条MERGE语句完全无关——MERGE是从源表读取数据更新目标表,不会修改源表本身。你需要排查
change_table的上游写入逻辑,是不是每次执行MERGE前,有新的变更数据被同步到了这个表中。
- 这和这条MERGE语句完全无关——MERGE是从源表读取数据更新目标表,不会修改源表本身。你需要排查
额外确认点
- 你是否混淆了“目标表新增行”和“源表新增行”的描述?
- 重复执行MERGE时,
change_table的数据是不是每次都有新增?比如它是CDC变更捕获表,每次执行都会拉取新的变更记录?
内容的提问来源于stack exchange,提问作者Psychotechnopath
相关产品推荐
相关产品推荐

