如何获取Databricks保存的文件名并对接Azure Data Factory使用
实现方案
方案1:按需求通过Notebook输出参数传递动态文件名
步骤1:Databricks侧配置输出参数
- 生成动态parquet文件名并写入ADLS时,先将完整文件路径/文件名存入变量,示例:
# 动态文件名可按时间戳、业务ID、管道运行ID等规则生成 dynamic_parquet_path = "abfss://你的容器名@存储账号名.dfs.core.chinacloudapi.cn/自定义路径/动态文件名.parquet" # 写入Parquet的逻辑 df.write.parquet(dynamic_parquet_path) # 输出路径给ADF dbutils.notebook.exit(dynamic_parquet_path)
步骤2:Azure Data Factory侧配置
- 在ADF管道中添加Databricks Notebook活动调用上述Notebook,活动运行完成后,返回的文件路径可通过表达式
@activity('你的Databricks活动名称').output.runOutput获取 - 配置复制活动:源数据集选择ADLS的Parquet格式,将数据集的文件路径设为参数,在复制活动的源配置页,把上一步获取的路径值传入该参数
- 接收器选择目标数据库表数据集,正常配置字段映射规则即可运行。
方案2:更优的低容错方案(无需手动传递参数)
如果你的业务场景允许调整存储规则,推荐用该方案,避免参数传递异常导致的同步失败:
- 调整Databricks的输出规则:每次运行生成的Parquet文件统一存入独立的分区文件夹下,比如路径规则为
/输出根路径/run_id=xxx/,run_id可以用ADF管道运行ID或者Databricks作业运行ID,保证每次运行的文件夹唯一 - 复制活动的源直接配置通配符匹配该分区路径下的所有Parquet文件,路径可通过ADF表达式直接拼接,示例:
@concat('/输出根路径/run_id=', pipeline().RunId, '/*.parquet'),无需Databricks返回文件名 - 也可以搭配ADLS存储事件触发规则,只要新的Parquet文件写入完成就自动触发同步管道,完全无需手动管理文件名。
注意事项
- 如果Spark写出的是多个分片的Parquet文件(part-xxx开头的多个文件),可以配置复制活动直接读取整个文件夹路径下的所有Parquet文件,ADF会自动合并同结构的Parquet数据写入目标表
- 路径和文件名尽量避免使用特殊字符,防止解析失败。
内容的提问来源于stack exchange,提问作者lyubol
相关产品推荐
相关产品推荐

