在Azure Data Factory中执行Databricks更新语句时遇错误求助
问题场景
我在Azure Data Factory中使用Lookup活动执行Databricks的更新语句,SQL代码如下:
UPDATE MPH_CATALOG_DEV.MPH_STAGE_SCHEMA.MPH_TABLE_REFRESH_LOOKUP SET ACTIVE = '0' WHERE TARGET_TABLE_SCHEMA = '@{item().TARGET_TABLE_SCHEMA}' and TARGET_TABLE_NAME = '@{item().TARGET_TABLE_NAME}' ; select 0 as id;
管道结构:
执行时出现错误:
已知条件:
- 目标数据库为Databricks
- 无法为Script活动选择Databricks数据源
- 已向查询传递参数值
解决方案
核心问题分析
Lookup活动的设计初衷是查询并返回结果集,并非执行DML操作。即便添加了select 0 as id来返回结果,仍可能因为Databricks JDBC驱动的多语句执行限制、ADF Lookup对DML操作的兼容性问题导致报错。
推荐解决方案:改用Databricks Notebook活动
既然无法使用Script活动,Databricks Notebook活动是更适合执行DML的选择:
- 在Databricks中创建一个Notebook,编写更新逻辑,通过参数接收
TARGET_TABLE_SCHEMA和TARGET_TABLE_NAME:%sql UPDATE MPH_CATALOG_DEV.MPH_STAGE_SCHEMA.MPH_TABLE_REFRESH_LOOKUP SET ACTIVE = '0' WHERE TARGET_TABLE_SCHEMA = dbutils.widgets.get("TARGET_TABLE_SCHEMA") AND TARGET_TABLE_NAME = dbutils.widgets.get("TARGET_TABLE_NAME") - 在ADF管道中添加Databricks Notebook活动,关联你的Databricks链接服务,选择目标Notebook。
- 在活动的参数设置中,传递
@{item().TARGET_TABLE_SCHEMA}和@{item().TARGET_TABLE_NAME}对应的值。
若必须使用Lookup活动的兼容调整
如果一定要用Lookup活动执行,尝试以下修改:
- 修改JDBC连接字符串:在Databricks链接服务的JDBC属性中添加
allowMultiQueries=true,允许执行多语句。 - 验证参数传递:确认ForEach活动的迭代项参数正确,
@{item()}能正确获取到TARGET_TABLE_SCHEMA和TARGET_TABLE_NAME的值,可以先通过Lookup查询参数值来验证。 - 简化SQL逻辑:确保UPDATE和SELECT语句能被Databricks正确解析,避免语法层面的冲突。
内容的提问来源于stack exchange,提问作者Santhu Kumar
相关产品推荐
相关产品推荐

