如何使用ADF对比数据湖与CSV文件名并完成复制/邮件告警
基于Azure Data Factory的解决方案
1. 读取CSV中的文件名列表
使用Lookup活动读取存储文件名的CSV文件:
- 数据源选择你的CSV文件,确保仅读取存储文件名的列(例如列名
filename)。 - 取消勾选「First row only」,这样Lookup输出会包含所有文件名的数组,格式为
@activity('Lookup CSV').output.value,每个元素结构为{ "filename": "目标文件名" }。
2. 提取并整理两个文件名集合
- 从Get Metadata活动的输出中提取数据湖的文件名数组,用以下表达式:
得到格式如@activity('Get Metadata').output.childItems[*].name["file1.csv", "file2.txt"]的字符串数组。 - 从Lookup活动输出中提取CSV里的文件名数组,表达式:
@activity('Lookup CSV').output.value[*].filename
3. 对比集合,标记缺失文件
添加Set Variable活动,定义字符串类型变量MissingFiles,用表达式计算CSV中有但数据湖里没有的文件:
@join(setDifference(variables('CSVFileNames'), variables('DataLakeFileNames')), ', ')
注:可以先将两个文件名数组存入变量,再代入表达式;若需忽略大小写,用toLower()统一转换后再对比,例如@tolower(activity('Get Metadata').output.childItems[*].name)
4. 复制匹配的文件
用For Each活动遍历CSV的文件名列表:
- 迭代项设为
@activity('Lookup CSV').output.value - 内部添加If Condition活动,判断当前文件名是否存在于数据湖:
条件表达式:@contains(activity('Get Metadata').output.childItems[*].name, item().filename) - 条件为真时,执行Copy Data活动:源配置为数据湖文件夹,文件名用动态内容
@item().filename;目标设为你指定的存储位置。
5. 发送缺失文件通知
添加If Condition活动,判断MissingFiles是否非空:
- 条件表达式:
@not(empty(variables('MissingFiles'))) - 条件为真时,执行Send Email活动,邮件内容示例:
配置好收件人、主题等信息即可。数据湖中缺失以下文件:@{variables('MissingFiles')}
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

