使用Databricks REST API 2.0导入多语言笔记本目录遇问题求助
解决Databricks REST API导入多语言笔记本的问题
首先,你的报错原因很明确:你直接把本地文件路径传给了content参数,但Databricks REST API要求这个字段必须是Base64编码的笔记本文件内容,不是路径,这才导致了"Illegal character"解析错误。
核心问题解答
是否需要将所有笔记本编码为Base64?
完全正确!每一个笔记本文件的内容都需要单独进行Base64编码后才能传入content参数。另外还要注意:你不能统一把language设为SCALA——因为你有Python和Scala两种笔记本,必须根据每个文件的语言类型对应设置language(比如Python文件用PYTHON,Scala文件用SCALA)。有没有导入目录的API示例?
Databricks REST API 2.0没有直接导入整个目录的接口,你需要自己遍历本地目录,逐个处理每个文件,同时保持目录结构(需要先在工作区创建对应的子目录)。下面是具体的实现步骤和示例:
1. 单个笔记本导入的正确请求示例
用curl命令实现(以Scala笔记本为例)
首先,读取本地文件并Base64编码,然后发起请求:
# 读取本地Scala笔记本内容并Base64编码 CONTENT=$(base64 -i ./db_code/my_notebook.scala) # 调用Databricks API curl -n -X POST https://<你的Databricks实例URL>/api/2.0/workspace/import \ -d '{ "content": "'"$CONTENT"'", "path": "/Users/dmitriy@kagarlickij.com/my_notebook.scala", "format": "SOURCE", "language": "SCALA", "overwrite": true }'
用Python的requests库实现
import base64 import requests # 配置参数 databricks_host = "<你的Databricks实例URL>" token = "<你的Databricks访问令牌>" local_file_path = "./db_code/my_python_notebook.py" workspace_target_path = "/Users/dmitriy@kagarlickij.com/my_python_notebook.py" # 读取文件并Base64编码 with open(local_file_path, "rb") as f: content_base64 = base64.b64encode(f.read()).decode("utf-8") # 构造请求体 payload = { "content": content_base64, "path": workspace_target_path, "format": "SOURCE", "language": "PYTHON", "overwrite": True } # 发起请求 response = requests.post( f"{databricks_host}/api/2.0/workspace/import", json=payload, headers={"Authorization": f"Bearer {token}"} ) # 检查响应 response.raise_for_status() print(f"成功导入笔记本到 {workspace_target_path}")
2. 批量导入整个目录的Python脚本示例
这个脚本会遍历本地./db_code目录的所有文件,自动创建工作区对应的子目录,并导入每个笔记本:
import os import base64 import requests # 配置参数 DATABRICKS_HOST = "<你的Databricks实例URL>" DATABRICKS_TOKEN = "<你的Databricks访问令牌>" LOCAL_SOURCE_DIR = "./db_code" WORKSPACE_BASE_PATH = "/Users/dmitriy@kagarlickij.com" # 语言映射:根据文件后缀对应API的language参数 LANGUAGE_MAP = { ".py": "PYTHON", ".scala": "SCALA", # 如果有.ipynb文件,可以根据实际情况添加,或解析notebook的metadata判断语言 ".ipynb": "PYTHON" # 示例:默认按Python处理,可根据需要调整 } def create_workspace_dir(path): """创建Databricks工作区目录""" response = requests.post( f"{DATABRICKS_HOST}/api/2.0/workspace/mkdirs", json={"path": path}, headers={"Authorization": f"Bearer {DATABRICKS_TOKEN}"} ) # 目录已存在时返回409,可忽略 if response.status_code not in [200, 409]: response.raise_for_status() def import_notebook(local_file, workspace_path): """导入单个笔记本到Databricks工作区""" # 获取文件后缀,判断语言 file_ext = os.path.splitext(local_file)[1].lower() language = LANGUAGE_MAP.get(file_ext) if not language: print(f"跳过不支持的文件类型:{local_file}") return # 读取文件并Base64编码 with open(local_file, "rb") as f: content_base64 = base64.b64encode(f.read()).decode("utf-8") # 构造请求体 payload = { "content": content_base64, "path": workspace_path, "format": "SOURCE", "language": language, "overwrite": True } # 发起请求 response = requests.post( f"{DATABRICKS_HOST}/api/2.0/workspace/import", json=payload, headers={"Authorization": f"Bearer {DATABRICKS_TOKEN}"} ) try: response.raise_for_status() print(f"✅ 成功导入:{workspace_path}") except Exception as e: print(f"❌ 导入失败 {workspace_path}: {str(e)}") def main(): # 遍历本地目录 for root, dirs, files in os.walk(LOCAL_SOURCE_DIR): # 计算工作区对应的子目录路径 relative_dir = os.path.relpath(root, LOCAL_SOURCE_DIR) if relative_dir == ".": workspace_dir = WORKSPACE_BASE_PATH else: workspace_dir = os.path.join(WORKSPACE_BASE_PATH, relative_dir) # 创建工作区目录 create_workspace_dir(workspace_dir) # 处理每个文件 for file in files: local_file_path = os.path.join(root, file) workspace_file_path = os.path.join(workspace_dir, file) import_notebook(local_file_path, workspace_file_path) if __name__ == "__main__": main()
注意事项
- 确保你的Databricks访问令牌有足够的权限(
workspace import和mkdirs权限) - 对于
.ipynb格式的笔记本,如果你用format: "SOURCE",可能需要先转换为Databricks支持的源码格式,或者改用format: "JUPYTER"(此时不需要指定language,API会自动解析) - 如果导入时遇到权限问题,检查工作区目标路径的权限设置
内容的提问来源于stack exchange,提问作者kagarlickij
相关产品推荐
相关产品推荐

