如何传递ADF Get Metadata输出至Databricks Notebook实现文件名比对
ADF对接Databricks实现双文件夹文件存在性校验方案
前置配置确认
两个Get Metadata活动的「字段列表」必须勾选Child items,否则拿不到路径下的文件/文件夹清单。活动输出的childItems数组包含路径下所有对象,每个对象自带name(对象名)、type(对象类型,值为File或Folder)两个属性。
步骤1:过滤提取纯文件名数组
不需要额外加中间活动做转换,直接在Databricks活动的参数配置里用ADF内置表达式过滤掉文件夹,只保留文件名数组,减少Notebook侧的冗余处理:
- 基准文件列表(即要求必须全部存在的文件所在文件夹)的文件名提取表达式:
@activity('你的第一个Get Metadata活动名称').output.childItems.where(item => item.type == 'File').select(item => item.name) - 待校验文件夹的文件名提取表达式:
@activity('你的第二个Get Metadata活动名称').output.childItems.where(item => item.type == 'File').select(item => item.name)
步骤2:配置Databricks Notebook活动的参数映射
- 新建Databricks Notebook活动,绑定对应Databricks工作区,选中提前写好逻辑的Notebook。
- 在活动的「基参数」栏新增两个Array类型参数,比如命名为
base_file_list和check_file_list,参数值分别填入上面写的两个提取表达式。 - 校验结果会自动存在活动输出的
runOutput字段里,不需要额外配置输出参数就能回传给ADF后续流程。
步骤3:Notebook侧比对逻辑实现
用Python写逻辑即可,集合做存在性判断的效率远高于列表遍历,文件量大的时候优势很明显:
# 接收ADF传入的两个文件列表参数 import json base_files = json.loads(dbutils.widgets.get("base_file_list")) check_files = json.loads(dbutils.widgets.get("check_file_list")) # 统一做去空格处理,避免前后空格导致的匹配误差 # 如果需要不区分大小写匹配,就在strip()后再加.lower() base_set = {file.strip() for file in base_files} check_set = {file.strip() for file in check_files} # 核心判断:基准列表是待校验列表的子集,说明所有基准文件都存在,返回true;否则返回false match_result = base_set.issubset(check_set) # 结果回传给ADF dbutils.notebook.exit(match_result)
注意:如果基准文件列表和待校验列表的对应关系反过来,只需要调换
issubset前后的集合对象即可,逻辑通用。如果要求两个文件夹文件名完全一致,就把判断条件改成base_set == check_set。
步骤4:ADF后续流程分支判断
Notebook活动后面接If Condition活动做流程分支,条件表达式直接填:@bool(activity('你的Databricks Notebook活动名称').output.runOutput)
- 条件为true时,走所有文件存在的后续业务流程
- 条件为false时,走缺失文件的告警、流程终止等逻辑
注意事项
- 如果单文件夹下文件量超过10万,不建议用Get Metadata拉全量清单,性能很差,直接在Notebook里通过文件系统API读两个路径的文件清单做比对效率更高。
- 如果文件名存在特殊字符、编码差异,提前在ADF表达式或者Notebook里做统一格式化,避免匹配误差。
- 两个Get Metadata活动记得加依赖配置,确保两个活动都跑完之后再触发Databricks活动,不要出现并行跑没拿到输出的问题。
内容的提问来源于stack exchange,提问作者harshith
相关产品推荐
相关产品推荐

