Azure Data Factory中已处理文件校验:数组包含判断表达式失效问题排查
问题分析与解决方案
你遇到的问题核心在于Lookup活动返回的是对象数组,而非纯字符串数组,直接用contains对比字符串和对象数组自然得不到正确结果。
问题根源
activity('Get All Files Processed').output.value是一个包含{ "FileName": "xxx.xlsx" }格式对象的数组,而activity('Get Detail of current file in iteration').output.itemName是纯字符串。contains函数会检查数组中是否存在完全等于该字符串的元素,但数组里的元素都是对象,和字符串永远不匹配,因此contains始终返回false,外层的not()就会一直返回true。
正确的两种实现方式
方式1:用map转换为纯文件名数组后再判断
使用ADF的map函数提取数组中每个对象的FileName属性,生成纯字符串数组,再用contains检查:
@not(contains(map(activity('Get All Files Processed').output.value, (item) => item.FileName), activity('Get Detail of current file in iteration').output.itemName))
map函数遍历已处理文件数组,将每个对象转换为对应的文件名字符串,得到类似["file1.xlsx", "file2.xlsx"]的数组- 此时
contains就能正确判断当前文件名是否在已处理列表中
方式2:用any函数直接匹配对象属性
通过any函数遍历数组,检查是否存在FileName与当前文件名相等的对象:
@not(any(activity('Get All Files Processed').output.value, (item) => equals(item.FileName, activity('Get Detail of current file in iteration').output.itemName)))
any函数会逐个检查数组中的对象,只要有一个对象的FileName和当前文件名匹配,就返回true- 外层的
not()则表示“当前文件未在已处理列表中”的判断逻辑
验证小技巧
你可以在ADF的调试模式中,查看Get All Files Processed活动的输出,确认value是对象数组;同时检查Get Detail of current file in iteration的itemName是字符串类型,这样就能更直观理解为什么原表达式不生效。
内容的提问来源于stack exchange,提问作者Saurabh Mehta
相关产品推荐
相关产品推荐

