ADF映射数据流处理Excel重复主键写入SQL约束冲突问题
ADF映射数据流处理Excel源重复主键分表存储方案
核心实现逻辑是通过内置转换拆分数据流分支,分别完成主表去重、关联表明细保留,从源头避免主键写入冲突,全程不需要编写自定义代码。
前置校验
- 确认映射数据流的源转换已正确加载Excel数据源,Id、Name、PhoneNo及其他维度字段映射无误
- 提前在目标SQL库中创建两张表:
- 主表:以
Id为主键,存储Id、Name及其他固定维度字段 - 手机号关联表:请勿将Id单独设为主键(可设置Id+PhoneNo为联合主键),存储Id、PhoneNo字段
- 主表:以
详细配置步骤
1. 公共预处理:给同Id记录打行序号
在源转换之后新增窗口转换,按如下规则配置:
- 分组设置:Over条件选择
Id字段,按Id对数据分组 - 排序设置:选择你判定"首条记录"的排序字段(比如Excel行号、数据录入时间,无明确排序规则时可直接选Id升序,默认取Excel中排列最靠前的同Id记录)
- 窗口列配置:新增列命名为
row_num,窗口函数选择rowNumber(),为每个Id分组内的记录生成从1开始的连续序号
注意:不要使用
rank()或denseRank()函数,同Id下如果存在完全重复的记录,这两个函数会生成相同序号,无法精准定位首条记录。如果同Id下的Name或其他维度字段存在取值不一致的情况,调整排序规则即可实现"取最新值""取非空值"等定制逻辑。
2. 拆分双分支分别写入目标表
从窗口转换的输出端口新建两个数据流分支,分别对应两张表的处理逻辑:
分支1:主表写入逻辑
- 新增
筛选转换,设置筛选条件为row_num == 1,过滤后每个Id仅保留1条记录 - 新增
选择转换,剔除row_num、PhoneNo等不需要存入主表的字段,仅保留Id、Name及其他需要的维度字段 - 新增
SQL Sink(接收器),指向提前创建好的第一张主表:全量写入时选insert模式,增量同步时可选upsert模式,以Id为匹配键即可。此时输出数据无重复Id,不会触发主键约束冲突。
分支2:手机号关联表写入逻辑
- 新增
选择转换,剔除row_num、Name及其他不需要存入关联表的维度字段,仅保留Id、PhoneNo字段 - 可选去重:如果源数据中存在Id+PhoneNo完全重复的无效记录,可新增
聚合转换,分组依据选择Id和PhoneNo,无需配置聚合函数即可自动完成重复值剔除 - 新增
SQL Sink(接收器),指向提前创建好的第二张手机号关联表,直接写入即可。
调试验证
- 开启数据流调试模式,先预览窗口转换的输出结果,确认每个Id分组下
row_num=1的记录符合你对"首条记录"的预期 - 分别预览两个接收器的输入数据:主表分支Id列无重复值,手机号分支Id与PhoneNo的对应关系和源Excel完全一致
- 验证通过后再触发管道正式运行,即可解决原有的主键冲突报错。
内容的提问来源于stack exchange,提问作者user961
相关产品推荐
相关产品推荐

