前言
最近小龙虾 OpenClaw 火出圈了,阿里云官方也出了相关文档:https://help.aliyun.com/zh/model-studio/openclaw-coding-plan 这里就不再赘述安装和配置,但值得提醒的是,部署尽量放在 docker 或者虚拟机中,目前来看小龙虾的安全问题还是比较严峻的。
接下来说说我们是如何使用的。
一、先说点实在的:我们为啥这么干
搞数仓开发的朋友都知道,天天写SQL、建表、跑任务,重复性工作特别多。我们团队用DataWorks + MaxCompute,419个任务分布在4个工作空间里,光标签相关的表就有200多个。
之前纯靠人工,经常出问题:
- 表名写错,跑半天才发现表不存在
- 标签代码重复,数据对不上
- 活动名称写错一个字,筛选出来的人数差一半
后来我们开始用OpenClaw+ClaudeCode的自动化工作流来辅助开发,说白了就是给ClaudeCode 配了个"数仓开发专家"的角色,让它帮我们干脏活累活。
经过一段时间的磨合, OpenClaw 目前的技能矩阵如下:
二、我们的三层架构:别搞混了
先交代下我们的数据流向,不然后面案例听不懂:
- ODS层:从MongoDB、MySQL、ERP这些源头捞数据,42个任务,主要是Python脚本做同步
- CDM层:做清洗、打宽表、算公共指标,92个任务,SQL为主
- ADM层:面向业务做标签、报表,257个任务,我们最忙的就是这层
重点说标签体系。我们搞了个"竖表"设计:
标签加工(SQL算出来)→ 标签竖表(一行一个标签)→ 标签整合表(宽表)→ 给业务用
比如一个顾客打了3个标签,竖表里就是3行;整合表变成3列。业务要查单个标签用竖表,要查顾客全景用整合表。
三、标签开发的标准流程:六步走
我们总结了一个"六步开发法",现在OpenClaw基本能半自动跑完:
第一步:需求分析
产品丢过来需求:"给我打个标签,3.8女神节来现场签到的顾客"。
这时候要确认三件事:
- 标签代码叫啥?(比如
act_aiwo_01,不能瞎编,得按分类来) - 二级分类code是啥?(比如
act_aiwo代表"爱我俱乐部活动") - 打标规则具体咋定义?(签到成功才算?报名了没来的算不算?)
坑点:产品说的"3.8女神节活动",系统里可能叫"3.8 女神宠爱日",差一个字就匹配不上。
第二步:数据源调研(最重要)
这是最容易翻车的地方。
必须去查DDL文件(表结构定义),确认:
- 表名到底是
s_erp_product_mall_sign_in还是s_erp_product_mall_sign_in_customer? status字段0是成功还是1是成功?create_time是时间戳还是字符串?
我们有个铁律:所有表名必须grep确认过才能用。
# 先搜DDL文件 find ddl/ -name "*sign_in*" grep -r "3.8" ddl/ # 确认字段 cat ddl/s_erp_product_mall_sign_in.ddl | grep status
第三步:方案设计
确定:
- 用哪个源表?
- 字段怎么映射到竖表的8个标准字段?
- 筛选条件写啥?
第四步:代码开发
写ODPS Script。这里OpenClaw的作用最大:
以前:自己吭哧吭哧写,容易漏字段、写错表名。
现在:把需求丢给Claude,它按模板生成,但必须人工审查。
我们的标准模板长这样:
-- 标签加工:参加3.8女神节活动 -- 标签代码:act_aiwo_01 -- 标签类型:SYSTEM -- 作者:张三 -- 创建时间:2026-03-12 SET odps.sql.type.system.odps2=true; UNION ALL SELECT c.customer_id AS cstm_id ,c.company_id ,CAST(NULL AS BIGINT) AS partner_id ,CAST(NULL AS BIGINT) AS tag_id ,'act_aiwo' AS tag_name -- 必须是二级分类code ,'act_aiwo_01' AS tag_code -- 标签代码 ,CAST(NULL AS TIMESTAMP) AS end_time ,'${bizdate}' AS opt_date FROM awods.s_erp_product_mall_sign_in_customer c -- 必须带项目前缀 JOIN awods.s_erp_product_mall_sign_in s ON c.sign_in_id = s.id AND s.ds = MAX_PT('awods.s_erp_product_mall_sign_in') -- 动态分区 WHERE c.ds = MAX_PT('awods.s_erp_product_mall_sign_in_customer') AND s.name = '3.8 女神宠爱日' -- 必须和系统里完全一致 AND c.status = 0; -- 0=签到成功,必须确认含义
重点看注释那几行,全是血泪教训:
tag_name必须是分类code,不能自己编- 表名必须带
awods.前缀 - 分区必须用
MAX_PT()或者${bizdate},不能写死日期
第五步:Claude Code审查(关键!)
代码生成后,必须让Claude再检查一遍。我们总结了个检查清单:
- 表名对不对? 是不是DDL里确认过的?
- 字段映射对吗?
customer_id有没有写成cstm_id? - tag_name取值对吗? 是不是二级分类code?
- 筛选条件对吗? 活动名称、状态值有没有搞错?
- 分区字段用对了吗? 有没有硬编码?
- 注释规范吗? 作者、时间写没写?
真实案例:有次Claude生成的代码里,活动名称用了产品文档里的"3.8女神节活动",但实际表里的数据是"3.8 女神宠爱日"(多了个空格,"宠爱"不是"节")。Claude审查时发现了这个不一致,避免了上线后数据为空的问题。
第六步:测试验证
一定要把验证能力用好,不然 AI 特别容易出现幻觉,我们总结了以下验证流程来保障数据的准确性:
开发环境跑一遍,检查:
- 数据量合理不?(比如预计打标1000人,跑出来10万肯定有问题)
- 抽样看几个顾客,标签打对没?
- 有没有重复打标?
验证SQL:
-- 看标签分布 SELECT tag_code, COUNT(DISTINCT cstm_id) FROM awadm.adm_awdata_mbr_cstm_label_vertical_d WHERE ds = '${bizdate}' AND tag_code = 'act_aiwo_01' GROUP BY tag_code; -- 检查顾客是否存在(防止customer_id映射错了) SELECT COUNT(*) FROM awadm.adm_awdata_mbr_cstm_label_vertical_d t LEFT JOIN awcdm.dim_customer c ON t.cstm_id = c.cstm_id WHERE t.ds = '${bizdate}' AND t.tag_code = 'act_aiwo_01' AND c.cstm_id IS NULL;
第七步:发布上线
DataWorks里提交→审批→发布→配置调度依赖。
四、OpenClaw的具体用法
1. 环境准备
我们把开发工具都放在/home/node/.openclaw/workspace目录下:
cd /home/node/.openclaw/workspace # 加载阿里云凭证(AK) . ./.dataworks_credentials # 凭证文件权限必须600,别提交到git chmod 600 .dataworks_credentials
2. 常用工具脚本
扫描工作空间:
python3 dataworks_scan.py # 看看awods、awcdm、awadm里都有哪些任务,依赖关系是啥
代码规范检查:
python3 validate_code.py scripts/act_aiwo_01.sql # 自动检查SQL语法、规范、常见错误
开发完整性检查:
python3 check_development_complete.py # 检查标签代码有没有重复、分类code对不对、表名是否存在
3. 和Claude的配合模式
我们摸索出一个"人机协作"的节奏:
适合Claude干的:
- 按模板生成代码框架
- 检查语法错误
- 解释表结构(把DDL翻译成大白话)
- 写验证SQL
必须人工干的:
- 确认业务规则(比如"签到成功"到底对应status=0还是1)
- 核对活动名称、产品编码这些具体值
- 最终的数据准确性验证
关键技巧:每次新会话,除了让Claude读文档,还要让它去搜相关文件:
"先搜索ddl目录下所有包含'sign_in'的文件,然后读一下最相关的2个DDL文件, 再帮我写这个标签的加工代码。"
这样Claude不会"失忆"乱编表名。
五、一个完整的实战案例
需求:打标"近365天充值TOP500"的顾客,给大客户裂变营销用。
Step 1:确认需求
- 标签代码:
imp_cz_01 - 分类code:
imp_cz(累计充值) - 规则:充值金额排名前500,且金额大于0
Step 2:找数据源
grep -r "recharge" ddl/ # 找到表:s_erp_product_erp_recharge cat ddl/s_erp_product_erp_recharge.ddl # 关键字段:customer_id, money, create_time, status, paystatus
Step 3:确认字段含义
status=0:有效记录paystatus='03':支付成功(问的业务,不是猜的)money:充值金额,单位元
Step 4:Claude生成代码
提示词:
根据以下信息生成ODPS Script代码: - 源表:awods.s_erp_product_erp_recharge - 顾客字段:customer_id - 公司字段:company_id - 金额字段:money - 时间字段:create_time - 筛选条件:status=0 AND paystatus='03' AND 近365天 - 取TOP500按金额降序 - 标签代码:imp_cz_01 - 分类code:imp_cz
Step 5:人工审查
检查Claude生成的代码:
- ✅ 表名带awods前缀
- ✅ 用MAX_PT()取最新分区
- ✅ 日期计算用DATEADD
- ✅ tag_name是imp_cz不是"累计充值"
- ⚠️ 确认paystatus='03'是不是支付成功(查文档确认)
Step 6:测试验证
跑开发环境,看:
- TOP500的最小金额是多少?(比如是10000元,那9999元的确实不该进)
- 有没有company_id为空的?(有的话要处理)
- 365天的边界对不对?(正好365天前的记录有没有包含)
Step 7:上线
提交到awadm工作空间,配置依赖(要等充值表的任务跑完才能跑这个)。
六、避坑指南:我们踩过的雷
1. 表名虚构
场景:以为签到表叫s_erp_product_sign_in,实际是s_erp_product_mall_sign_in。
后果:任务发布失败,或者更惨,跑成功了但是数据为空(因为表存在但是没数据)。
解决:必须用find或grep在DDL目录里确认过表名才能用。
2. 标签代码重复
场景:两个人同时开发,都用了act_01。
后果:数据互相覆盖,标签值混乱。
解决:用check_development_complete.py脚本提前检查,或者维护一个标签代码登记表。
3. 状态值搞反
场景:以为status=1是有效,实际是status=0。
后果:标签数据全错,而且很难发现(因为SQL能跑通,只是结果不对)。
解决:必须看DDL里的注释,或者抽样查几条数据验证。
4. 活动名称不一致
场景:产品文档写"3.8女神节",系统里存"3.8 女神宠爱日"。
后果:筛选条件匹配不上,结果为空。
解决:用SELECT DISTINCT name FROM table先查一遍实际值。
5. 分区字段硬编码
场景:测试时写了ds = '20260310',上线忘记改。
后果:每天跑的都是3月10号的数据。
解决:用MAX_PT()或${bizdate},代码审查时重点看。
七、总结:人+AI的正确姿势
用了一段时间 OpenClaw + ClaudeCode,我们的感受是:
AI不是来替代人的,是来替代"重复劳动"和"低级错误"的。
- 写标准格式的代码框架?AI干,快且准。
- 检查语法错误?AI干,比人细心。
- 确认业务规则?人干,AI会瞎猜。
- 核对具体数据值?人干,AI会"幻觉"。
最有效的用法:
- 让AI按模板生成初稿
- 人工审查关键业务点(表名、字段值、规则逻辑)
- 让AI写验证SQL
- 人工跑验证、确认结果
这样一套下来,开发时间从原来的 6-8 小时压缩到1.5-2小时,而且错误率明显下降。最重要的是,人可以把精力放在理解业务、设计方案上,而不是拼SQL语法。
最后说一句:OpenClaw 就像是一个新来的员工,你要不断的将自己的掌握的能力输出给它让它学习,它才能够更加准确更加快速的给到我们对应的结果。工具再好,数据准确性这根弦不能松。宁可多花时间验证,也不能让错误数据流到业务手里。这是数仓开发的底线。