You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:08:14