Azure Databricks Notebook无法获取Job API传递的参数求助
问题描述
Flask应用捕获Web表单输入值,将其作为参数触发Azure Databricks Job,尝试了两种参数传递格式:
- 使用
notebook_params的payload:
payload = { 'notebook_params': { 'customer_name': customer_name } }
- 使用
notebook_task.base_parameters的payload:
payload = { "notebook_task": { "notebook_path": "/Shared/.../", "base_parameters": { "customer_name": customer_name, } } }
遇到的问题:
- 创建Job时设置默认参数,传入的值无法覆盖默认值;
- 移除Job默认参数后,传递的参数为空值;
- Databricks Notebook中未设置默认值时,
print返回空值,Notebook代码如下:
# Get the customer_name value from the parameter dbutils.widgets.get("customer_name", "",") customer_name = dbutils.widgets.get("customer_name") # Use the customer_name in your notebook logic print("Customer Name:", customer_name)
执行Job时可见运行参数,但Notebook无法正确获取,期望返回传入的customer_name=Cx4。
排查与解决步骤
1. 修正Notebook参数获取的语法错误
你的Notebook代码存在语法错误:dbutils.widgets.get("customer_name", "",")的第三个参数多了一个双引号,导致代码执行异常,无法正确读取参数。修正后的代码如下:
# 先定义widget再获取参数(带默认值) dbutils.widgets.text("customer_name", "") customer_name = dbutils.widgets.get("customer_name") print("Customer Name:", customer_name)
如果不需要默认值,可简化为:
dbutils.widgets.text("customer_name") customer_name = dbutils.widgets.get("customer_name") print("Customer Name:", customer_name)
注意:
dbutils.widgets.get需要对应已定义的widget,直接调用未定义的widget会报错,先通过dbutils.widgets.text定义参数是稳妥的做法。
2. 匹配Job API调用的参数格式
Azure Databricks不同的Job操作对应不同的参数格式,不可混用:
- 触发已存在的Job(调用
jobs/run-nowAPI):必须使用notebook_params传递参数,覆盖Job默认值:
payload = { "job_id": "你的JobID", "notebook_params": { "customer_name": customer_name } }
- 创建并触发一次性Job(调用
jobs/runs/submitAPI):使用notebook_task.base_parameters,同时确保notebook_path是完整正确的路径:
payload = { "run_name": "客户数据处理任务", "notebook_task": { "notebook_path": "/Shared/完整的笔记本路径", "base_parameters": { "customer_name": customer_name } }, "new_cluster": { "spark_version": "13.3.x-scala2.12", "node_type_id": "Standard_DS3_v2", "num_workers": 1 } }
3. 确认参数名称的一致性
参数名称是大小写敏感的,请确保:
- Flask传递的参数名
customer_name,与Job默认参数名、Notebook中定义的widget名完全一致; - 无拼写错误(如
Customer_Name和customer_name会被识别为两个不同参数)。
4. 添加调试代码验证参数接收
在Notebook中添加调试代码,打印所有widget参数,确认是否接收到值:
# 打印所有已定义的widget参数 all_widgets = dbutils.widgets.getAll() print("所有参数:", all_widgets)
如果此处能看到customer_name的正确值,说明参数传递正常,问题出在后续业务逻辑;如果看不到,需要检查Flask的API请求是否正确发送,以及Databricks API的响应状态。
内容的提问来源于stack exchange,提问作者Tauqeer Khan
相关产品推荐
相关产品推荐

