如何用Python调用Databricks Notebook并解决REST API请求格式错误
解决Databricks RunsApi提交任务的MALFORMED_REQUEST错误
错误核心原因
出现MALFORMED_REQUEST错误,本质是请求体里的notebook_params(或新版本的base_parameters)格式不符合要求——Databricks要求这个参数必须是键值对Map类型(对应JSON对象),而非数组、纯字符串或其他结构。
完整解决方案
1. 编写处理参数的Databricks Notebook
先在Databricks上创建一个Notebook,负责接收参数、执行字符串反转逻辑,并把结果输出给本地脚本:
# Databricks Notebook 代码 # 定义接收参数的组件 dbutils.widgets.text("input_str", "", "输入字符串") input_str = dbutils.widgets.get("input_str") # 执行字符串反转操作 reversed_str = input_str[::-1] # 将结果返回给调用方,必须用dbutils.notebook.exit dbutils.notebook.exit(reversed_str)
2. 本地Python脚本正确调用RunsApi
确保本地脚本里的参数传递是字典(对应Map类型),同时完成任务提交、状态轮询和结果获取:
# 本地Python脚本代码 from databricks_cli.sdk.api_client import ApiClient from databricks_cli.runs.api import RunsApi import time # 初始化API客户端,替换成你的实例信息 api_client = ApiClient( host='https://<你的Databricks实例URL>', token='<你的个人访问令牌>' ) runs_api = RunsApi(api_client) # 提交Notebook任务,重点:base_parameters是字典格式 run_response = runs_api.submit_run( run_name="字符串反转任务", existing_cluster_id="<你的集群ID>", # 也可以用new_cluster参数创建临时集群 notebook_task={ "notebook_path": "/Workspace/你的Notebook完整路径", "base_parameters": { "input_str": "Hello Databricks" # 键值对Map,完全符合要求 } } ) run_id = run_response["run_id"] print(f"任务提交成功,Run ID: {run_id}") # 轮询等待任务结束 while True: run_status = runs_api.get_run(run_id) state = run_status["state"]["life_cycle_state"] if state in ["TERMINATED", "SKIPPED", "FAILED"]: break print("任务运行中...") time.sleep(5) # 读取任务结果 if run_status["state"]["result_state"] == "SUCCESS": result = run_status["notebook_output"]["result"] print(f"反转结果: {result}") else: print(f"任务失败,原因: {run_status['state']['state_message']}")
关键注意事项
- 参数格式要求:
base_parameters必须是字典,键对应Notebook里dbutils.widgets.text定义的参数名,值必须是字符串(Databricks仅支持字符串类型的参数传递)。 - 集群选择:可以用现有集群(填
existing_cluster_id),也可以通过new_cluster参数定义临时集群,适合一次性任务。 - 结果传递:必须用
dbutils.notebook.exit()返回结果,否则本地脚本无法获取到输出内容。 - 权限验证:确保你的个人访问令牌拥有
run_submit、run_read等必要权限。
常见问题排查
如果还是报MALFORMED_REQUEST,检查这几点:
- 有没有把
base_parameters拼写成旧版的notebook_params(新版本推荐用base_parameters)。 - 参数值是不是全为字符串,不能传数字、布尔值等非字符串类型。
- Notebook路径是否是Workspace里的完整路径,不能只写文件名。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

