MaxFrame Notebook 开发

更新时间:
复制 MD 格式

MaxFrame Notebook 是 MaxCompute AI数据探索客户端内置的 Python 数据加工模块。支持用 pandas 风格的代码编写大数据加工作业,在客户端里逐段运行、看到每一步的输出和写入的表,也可以用一句话让 AI 写完整个作业。

功能概述

MaxFrame 是 MaxCompute 的分布式 Python 计算框架,API 与 pandas 高度兼容,但计算在 MaxCompute 上完成,因此能处理远超单机内存的数据量。

在客户端里,无需本地安装 Python 环境、也不需要配置 AccessKey:新建一个 Notebook 就能直接写代码运行,凭证按当前连接自动注入。

maxframe-notebook-development-guide-zh

适用场景

  • 多步数据加工:抽取、清洗去重、脱敏、派生字段、写入结果表,用一个 Notebook 串起完整链路。

  • SQL 不好写的逻辑:正则批量处理、复杂字符串加工、按行自定义计算、跨列派生等,用 Python 更直观。

  • 多模态数据处理:配合 Blob 列类型,批量处理表中存储的图片、音频、视频。

  • AI 自动生成:描述清楚「读哪张表、做什么、写到哪张表」,由 AI 生成代码、自动检查并跑通。

功能一览

功能

说明

Notebook 编辑

Python 与 Markdown 两种单元格,支持插入、删除、上下移动、代码高亮

分段运行

可以运行全部单元格,也可以只运行改动的那一格

结果查看

每格下方展示输出日志、进度条、以及本格写入表的数据预览

静态检查

运行前检查常见问题(漏调 execute()、全表扫描、硬编码密钥等)并给出修改建议

运行历史

保留每格的历史运行记录,可回看任意一次的结果

AI 协作

在 Notebook 内让 AI 生成、修复、解释代码;或在 AI 对话里一句话生成整个作业

前提条件

  1. 已安装并启动MaxCompute AI数据探索客户端

  2. 已配置好数据连接,并选中了要使用的 MaxCompute 项目。左侧栏的 MaxFrame 分区在没有活动连接时不显示。

  3. 当前连接的账号有目标项目的读写权限(写结果表需要建表和写入权限)。

  4. 使用 AI 功能前,需在设置 > AI 配置中填好 API URL、API Key 和模型名称。

快速入门

下面以「读一张明细表,清洗去重后写入结果表」为例。

步骤一:新建 Notebook

在左侧栏找到 MaxFrame 分区,单击右侧 +,填写名称(例如 mf_my_pipeline)后单击创建 Notebook。创建成功后自动打开编辑器。也可以从统一的新建文件对话框中选择 MaxFrame 类型创建。

说明

同一个项目下 Notebook 名称不能重复。如果提示创建失败,请换个名称或先删除同名的旧草稿。

步骤二:AI 生成代码

单击编辑器顶部的 AI 续写,右侧 AI 助手面板会切到 MaxFrame 作业助手。在输入框里描述需求,例如:

读 project_with_dr.sales_detail,去掉重复记录、过滤掉金额为空的行,
按天汇总销售额和订单数,写入 project_with_dr.sales_daily。
每一步用独立单元格,并在 Markdown 单元格里写明步骤名。

AI 会先读取当前 Notebook,然后生成代码。

步骤三:确认应用

AI 改动 Notebook 前会弹出确认卡片,展示修改内容以及修改原因:

  • 单击应用到 Notebook:代码写入 Notebook,编辑器立即刷新,AI 接着自动做一次检查。

  • 单击取消:本次改动不生效,拒绝后可以重新生成。

应用后如果不满意,直接继续说,例如「把去重改成只按订单号去重」,AI 记得前面的上下文。

步骤四:检查

单击顶部的检查,客户端会扫描代码里的常见问题,结果显示在底部面板的 Advisor 标签里。

单击某条问题的定位到可以跳到对应代码行;也可以直接单击让 Agent 修复全部,交给 AI 改。

步骤五:运行与写表

单击工具栏的运行,客户端将从上到下依次执行所有 Python 单元格,并在顶部显示执行进度(如"正在运行单元格 3/5")。

to_odps_table(...).execute()执行完成后,结果即写入 MaxCompute 表,无需额外的发布或部署步骤。运行结束后,可在单元格下方预览写入的表数据。

如果只修改了某个单元格,无需重新执行全部单元格,在该单元格的工具栏单击运行单元格即可。

编写 Notebook

单元格类型

Notebook 用注释标记划分单元格,本质上还是普通的 Python 文件:

标记

类型

用途

# %%

Python

可执行的加工代码

# %% [markdown]

Markdown

步骤说明、假设、注意事项,不参与执行和检查

编辑器顶部会显示当前 Notebook 的单元格构成,例如 8 个单元格 · 3 个 Markdown · 5 个 Python

编辑操作

功能

操作方式

加一个单元格

单元格之间和末尾的添加条上,单击 Python 或 Markdown

改代码

单元格工具条上单击编辑代码单元格,改完单击预览回到渲染态

改说明文字

直接单击 Markdown 区域即可编辑

调整顺序

单元格工具条上的上移单元格 / 下移单元格

删除

单元格工具条上的删除单元格(至少保留一个 Python 单元格)

运行这一格

单元格工具条上的运行单元格

内容自动保存,顶部会显示 未保存 / 保存中 / 已保存 状态。检查和运行前都会先保存。

在左侧栏的 Notebook 上单击右键,还可以加入聊天(把代码作为附件发给 AI)、复制名称删除

代码组织规则

每个单元格独立编译执行,但变量在单元格间共享。需注意如下两条规则

  • 规则一:每个单元格内的代码块必须语法完整。

    try/finallyiffordef 等语句块不得跨单元格拆分,否则将报语法错误。

    # ✗ 错误:try 和 finally 被拆到两格# %%try:
        result.execute()
    
    # %%finally:
        session.destroy()
    # ✓ 正确:完整放在同一格# %%try:
        result.execute()
    finally:
        session.destroy()
    
  • 规则二:变量可跨单元格使用。

    前序单元格中定义的变量(如sessiondf)可在后续单元格中直接引用,无需重复定义。

    AI 自动生成的代码已遵循上述两条规则,手动编写时请留意。

若单元格最后一行为表达式,其值将自动输出,便于快速查看结果(与 Jupyter 行为一致)。

完整示例

# %% [markdown]# ## 步骤 1:创建 session# MaxFrame 需要显式创建 session,作业结束时释放。# %%import maxframe.dataframe as md
from maxframe.session import new_session

session = new_session()

# %% [markdown]# ## 步骤 2:读表并清洗# 去重 + 过滤空金额。# %%
df = md.read_odps_table("project_with_dr.sales_detail")
clean = df.dropna(subset=["amount"]).drop_duplicates(subset=["order_id"])

# %% [markdown]# ## 步骤 3:按天汇总并写入结果表# %%
daily = clean.groupby("stat_date").agg({"amount": "sum", "order_id": "count"})
daily.columns = ["total_amount", "order_count"]

try:
    md.to_odps_table(daily, "project_with_dr.sales_daily", overwrite=True).execute()
finally:
    session.destroy()

注意事项:

  • MaxFrame 采用惰性执行机制,未调用 execute() 时计算不会实际提交。

  • overwrite=True 表示每次全量覆盖结果表;若表不存在,则自动创建。

  • execute()与 session.destroy() 须通过 try/finally 封装在同一单元格内,确保资源正确释放。

  • 请勿在代码中硬编码 AccessKey。凭证已根据当前连接自动注入,需要 PyODPS 时直接调用 ODPS.from_environments() 即可获取已鉴权的入口。

运行与查看结果

运行方式

方式

入口

适用场景

运行全部

顶部运行

完整跑一遍。会先重置运行状态,从干净的环境开始

运行单格

单元格工具条运行单元格

只改了某一格,复用前面已经算好的变量做增量调试

运行中顶部会出现取消按钮。同一个 Notebook 同时只能有一个任务在跑,重复触发会提示该草稿已有运行中的任务,等它结束或取消后再试即可。

查看单元格输出

每格运行后,下方分三个标签展示结果:

标签

内容

输出

代码打印的日志,可展开、收起、复制

目标表

这一格写入的表的数据预览

控制台

错误信息和进度条

  • 目标表预览:客户端会自动识别这一格写入了哪张表,写完后在目标表标签里直接看数据。可以切换看前 20 / 50 / 100 行、刷新,或单击外链图标打开完整的表详情。

  • 回看历史:同一格跑过多次时,右上角会出现一个选择器,按时间和状态切换查看之前某一次的结果。每格保留最近 10 次。输出区顶部还会显示本次运行的耗时、Instance ID 和 打开 LogView 链接,需要排查 MaxCompute 侧问题时可直接跳转。

底部面板

编辑器下方有三个标签,可以整体折叠:

  • 运行详情:分为摘要标准输出控制台DAG 四个子标签。摘要里看本次运行的状态与耗时,失败时会标出失败位置并提供让 Agent 修复按钮。

  • 历史:这个 Notebook 的全部运行记录(时间、模式、状态、耗时),失败的标红,可展开看详情。

  • Advisor:最近一次检查发现的问题列表。

检查作业

单击顶部检查,客户端会在不真正跑作业、不消耗计算资源的前提下扫描 Python 代码(Markdown 内容不参与检查),提前发现写 MaxFrame 容易踩的坑,主要覆盖四类:

  • 作业跑不出结果:漏建 session、漏调 execute()、session 清理时机不对。MaxFrame 是懒执行的,这类问题会让作业看似正常结束但实际什么都没做。

  • 性能与成本风险:读分区表没限定范围导致全表扫描、把大结果集拉回本地、用逐行处理应对大规模数据。

  • 安全问题:代码里硬编码了密钥。凭证已由客户端自动注入,不需要也不应该写在草稿里。

  • 产出不完整:作业没有任何写表动作,只做分析时可以忽略,要交付结果表时则需补上。

AI 作业开发

客户端提供两种 AI 协作方式,根据当前所处界面选择即可。

方式一:在 Notebook 里用 AI 修改代码

打开 Notebook 后单击 AI 续写,右侧面板进入 MaxFrame 作业助手。空会话时提供三个快捷操作:

快捷操作

执行

生成 Notebook 作业

生成完整作业:Markdown 写说明、Python 写逻辑,然后自动检查并申请运行

检查并修复

排查代码、session 生命周期、execute / 写表用法的问题,给出最小改动

解释当前作业

讲清楚输入表、关键变换、输出表和潜在风险,不改代码

两类确认卡片,涉及副作用的操作都需要人工确认:

  • 改代码:展示改动摘要和理由,单击应用到 Notebook 生效,单击取消拒绝。

  • 要运行:告知会重置运行状态并跑完全部 Python 单元格、可能消耗计算资源或写入数据,单击运行 Notebook 才真正执行。

等确认期间输入框会锁定。AI 回复过程中可以随时停止,停止后对话上下文完整保留,可以接着补充或改需求。

对话历史保存在服务端,单击面板顶部的时钟图标可以找回之前的会话,单击 + 开始新对话。

方式二:在 AI 对话里一句话生成作业

如果加工只是一个更大分析任务里的一环,直接在 AI 对话(AI Query)中描述需求即可,无需手动建 Notebook。例如:

用 MaxFrame 把 project_with_dr.sales_detail 按天聚合销售额和订单数,写入 project_with_dr.sales_daily,
然后基于 sales_daily 画出最近 30 天的销售额趋势图。

AI 会自己判断这里面有一段 MaxFrame 加工任务,把它交给一个专门的子任务去完成,然后拿着结果表继续画图。

  1. 子任务写好代码后,MaxFrame Notebook 页面自动打开(在对话右侧栏,或中间区域的标签页)。

  2. 代码和运行过程逐格实时显示,效果和手动单击运行相同

  3. 任务失败时,子任务会读报错、自行修改代码重跑,直到成功,无需逐轮介入。

  4. 右侧栏的子 Agent 列表里能看到这个作业的状态,单击可以随时跳回对应的 Notebook。

对于建表、写表、INSERT/UPDATE 等数据变更操作,建议通过 MaxFrame 子任务执行。在主对话通道中,这类操作会触发逐条确认,中断交互流程;交由 MaxFrame 子任务执行时,代码在 MaxFrame 运行时中运行,过程完整可见、可取消、可续跑,完成后自动返回输出表名供后续步骤直接引用。

子任务完成后,AI 可基于返回的表名继续执行 SQL 查询、生成图表或添加到 Dashboard,无需手动传递表名。

若作业中途被打断,AI 会主动告知,可指示其继续未完成的作业。也可随时取消,取消操作将立即终止子任务。