Azure Data Factory中获取不匹配记录:Lookup与条件判断失效问题
解决ADF中筛选两个Excel表不匹配记录的问题
问题场景
我在Azure Data Factory中用两个Lookup活动读取两张Excel表,分别连接到For Each活动,在活动内通过Set Variable设置@item.id,想筛选出两边不匹配的记录并存到新变量。尝试用If Condition活动,表达式为if(equals(setvariable1,setvariable2),null,setvariable1)但未生效。
两张表数据:
第一张表
Name id Ganesh 1 Vivek 2 Lah 3
第二张表
Name id Ganesh 1 Vivek 2 Man 3
期望输出:
Man 3 Lah 3
问题根源
你当前的实现逻辑存在核心缺陷:分别遍历两个表并单次比较当前遍历项的id,只能判断两个临时变量的id是否相等,无法完成全量的交叉匹配校验。比如当Lookup1遍历到Lah 3、Lookup2遍历到Man 3时,equals(3,3)会返回true,直接跳过这条实际不匹配的记录(Name不同),同时这种方式也无法批量收集所有不匹配项。
正确实现步骤
不需要嵌套For Each和If Condition,直接利用ADF的数组函数处理Lookup返回的数据集即可:
- 定义变量
在ADF流水线中创建3个数组类型的变量:
var_table1_records:存储第一张表的所有记录var_table2_records:存储第二张表的所有记录var_mismatched_records:存储最终筛选出的不匹配记录
- 读取并存储表数据
- 用
Set Variable活动给var_table1_records赋值:@activity('Lookup1').output.value - 用
Set Variable活动给var_table2_records赋值:@activity('Lookup2').output.value
- 筛选并合并不匹配记录
用Set Variable活动给var_mismatched_records赋值,通过filter筛选出各自表中对方没有的记录,再用union合并结果:
@union( filter(variables('var_table1_records'), not(contains(variables('var_table2_records'), item()))), filter(variables('var_table2_records'), not(contains(variables('var_table1_records'), item()))) )
逻辑说明
contains(variables('var_table2_records'), item()):ADF会比较整个记录对象的所有字段,因此Lah 3和Man 3会被判定为不同记录filter函数筛选出当前表中、但不存在于另一张表的所有记录union函数将两张表各自的不匹配记录合并成一个数组,最终得到你需要的Man 3和Lah 3
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

