dbt 解决什么问题:从订单到可信报表
目标:用一条订单分析流程,说明 dbt 的输入、输出以及它与数据库的分工。
假设你经营一家小商店。业务系统保存了订单,老板问:“每个客户一共消费了多少?”第一次,你写一条 SQL 就能回答。后来财务要求排除退货,运营又把金额从“分”误当成“元”,同一个客户在两张报表里的消费额就不同了。
问题不只是会不会写求和。你还需要知道:大家用了哪份规则?这条查询依赖哪些数据?有人改了规则,怎么发现影响?明天能不能重新运行同一套流程?dbt 把这些转换逻辑组织成有依赖、有检查、有说明的项目。
这门课共 14 课,默认你没用过 dbt。第 1–5 课认识工具并准备本地订单数据,第 6–8 课生成报表并检查错误,第 9–14 课学习物化、宏、文档、增量和环境隔离。SQL 语法会随例子解释;只要会创建文件、执行终端命令,就可以从这里开始。
学习时按顺序累积同一个小项目,每课先预测、再运行、再做练习。每课可安排 30–60 分钟,连接、测试和增量几课可以慢一些。所有数据都是虚构样本,不需要云账号;下一课才开始安装工具。练习结束时按课文恢复主版本,避免一次故意制造的错误影响后续课程。
先分清谁做什么
这里的 dbt 来自 data build tool;本课讨论数据分析工具。一个典型流程可以写成:
业务系统 → 采集或同步程序 → 数据库中的原始表
↓
dbt 管理的转换
↓
分析表 → 报表
原始表是已经进入分析数据库的数据。数据库负责保存它们并执行 SQL;dbt 读取项目文件,生成数据库能执行的语句,按依赖顺序提交任务。报表工具再读取结果。所谓数据仓库,可以先理解为面向分析组织数据的系统;本课用一个本地 DuckDB 数据库承担这个角色。
ELT 是 Extract、Load、Transform:先提取和加载,再在目标数据平台中转换。dbt 项目的主要工作在 T。后面为了容易复现,我们用 CSV 装载几行样本,不把这个教学办法当作生产系统的数据同步方案。dbt 平台还可以提供调度等能力,但一份本地模型文件本身不会每天自动运行。
| 你需要做的事 | 本项目中由谁完成 |
|---|---|
| 从订单接口持续拉取交易 | 采集程序;本课用虚构 CSV 代替 |
| 执行筛选、连接、求和 | DuckDB |
| 保存 SQL、安排模型顺序、运行测试 | dbt |
| 画销售额折线图 | 报表工具;不属于本课交付物 |
不写代码,也能先算出验收值
这是后续项目中的前三笔订单。先看单位,再看状态。
| order_id | customer_id | status | amount_cents |
|---|---|---|---|
| 101 | 1 | completed | 1200 |
| 102 | 1 | returned | 800 |
| 103 | 2 | completed | 2500 |
我们约定:每笔订单只占一行;只有 completed 计入消费;金额除以 100 后以元展示。于是客户 1 消费 12.00 元,客户 2 消费 25.00 元,总额 37.00 元。如果直接把三行都求和,会得到 45.00 元。这个差异来自业务规则,换一个更快的数据库不会自动修正它。
后面的项目会先整理字段与类型,得到 stg_orders,再生成每位客户一行的 customer_summary。前者是 staging(整理输入的层),后者是面向具体分析问题的 mart(数据集市)。模型在这里表示一份数据转换定义,和机器学习训练出来的模型不是同一种概念。
动手画出你的第一条数据路线
- 在纸上写下“原始订单 → 整理后的订单 → 客户消费汇总”。箭头表示后一个结果依赖前一个结果。
- 给第二步标注“统一金额单位和状态写法”。给第三步标注“筛选 completed,再按客户求和”。
- 把 102 的状态改成 completed,重新计算。客户 1 应变成 20.00 元,总额变成 45.00 元。
- 思考这次变化需要重新获取业务数据、修改转换代码,还是重新计算结果。这里是输入值变了,口径没变,因此应该沿依赖重新计算。
本课不需要安装工具,也不创建项目文件。手算值将在后续自动化实验中变成检查依据。
独立练习
再加入一笔订单:104、客户 2、cancelled、600 分。按照原口径,总消费是多少?如果有人说“dbt 会帮我从电商接口下载订单,也会永久保存所有原始数据”,你会如何纠正?
参考答案
以最初三行数据为基础加入 104,总消费仍是 37.00 元,因为 returned 和 cancelled 都不计入。若接着做了引导练习、保留 102 为 completed,则是 45.00 元;先确认输入版本,才能比较答案。
在本地 SQL 建模流程中,dbt 负责管理和执行转换,接口采集需要另一个环节,持久保存由连接的数据库承担。用 dbt 创建表不意味着 dbt 自己就是一个数据库服务器。
如果你把分和元加在一起,先统一单位;如果对退货是否计入有疑问,先写明业务口径。工具不能替你猜测这两件事。面对一条临时查询,直接 SQL 已经够用;当查询需要多人复用、定期重跑和追踪影响,组织成 dbt 项目的收益才开始明显。