未记录事实核验 · 状态:维护中
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 适用边界与维护说明
本文适合具备 SQL 和数仓基础的读者理解 dbt 的转换职责、ref() 依赖声明及 SQL 项目工程化理念;SQL、YAML 片段用于概念说明,练习是场景辨析,不是完整可运行项目。当前企业生产采用名单、适配器成熟度星级和支持标签仍未提供来源、评价口径或适用时间,不能据此判断企业当前采用情况或完成生产选型;ETL 与 ELT 的对比也应作为典型架构的简化说明,不宜将传统 ETL 的工具和成本局限视为普遍结论。岗位增长排名已明确为待验证假设,职业建议不承诺薪资收益。本次仅作全文结构审阅,未进行外部事实、链接可达性或代码运行核验。 已取消无法确定目标的可点击引用「Git/03-Git基础操作」,保留原提及;Missing link target: Git/03-Git基础操作 已取消无法确定目标的可点击引用「Flink核心概念」,保留原提及;Missing link target: Flink核心概念
dbt 概述与理念 - 什么是分析工程化
abstract 本文核心
本文不急着讲怎么用 dbt,而是花时间解释清楚:为什么需要 dbt,以及 dbt 代表的工程化思维是什么。 这些"为什么"比"怎么做"更重要,它们决定了你能不能真正用好这个工具。
一个真实的困境
设想你是一家电商公司的数据分析师。每天你的工作是:
- 从 MySQL 业务库里拉数据
- 在 Excel 或者 BI 工具里做各种 SQL 查询
- 把结果整理成报表发给业务方
一开始你的文件夹长这样:
分析/
└── 用户留存分析.sql
三个月后:
分析/
├── 用户留存分析.sql
├── 用户留存分析_修改版.sql
├── 用户留存分析_新口径.sql
├── 用户留存分析_按老板要求改的.sql
├── 收入汇总.sql
├── 收入汇总(正确的).sql
├── 订单分析_小王写的.sql
├── 订单分析_我写的.sql
└── GMV报表_最终版_真的最终版.sql
这就是数据分析工作的现实困境:SQL 脚本很快就会陷入混乱。没有版本控制、没有依赖关系、没有测试、没有文档,质量全靠人肉保证。
dbt 的出现,正是为了解决这个问题。
dbt 是什么
dbt(data build tool) 是一个开源的命令行工具,它让数据分析师能用软件工程的方式来管理 SQL 转换逻辑。
一句话定义:
dbt 让你能够通过写 SELECT 语句来转换数据仓库中的数据,根据声明管理依赖关系,并通过配置和运行相关命令执行测试、生成文档;项目版本控制需配合 Git 等工具完成。
注意这个定义里的关键词:SELECT 语句。dbt 的模型(Model)就是一个 SELECT 语句,你不需要写 CREATE TABLE、INSERT INTO、DROP TABLE——这些 dbt 帮你做。
tip 一个类比
如果你用过 React,dbt 的关系有点像 React 对 DOM 操作的封装:
- 你描述"我想要什么"(SELECT 语句)
- dbt 负责"怎么实现"(CREATE TABLE / CREATE VIEW / MERGE 等)
如果你没用过 React,可以这样理解:你主要描述转换逻辑,dbt 根据模型配置和适配器生成并执行相应的数据库操作;数据仓库、权限和运行环境等基础设施仍需另行配置与维护。
ETL vs ELT:一个根本性的范式转变
理解 dbt,必须先理解 ETL 到 ELT 的演变。
传统 ETL(Extract → Transform → Load)
数据源 ──→ [提取] ──→ [转换] ──→ [加载] ──→ 数据仓库
↑ ↑
Informatica 转换发生在
SSIS/DataStage 仓库外面
转换逻辑运行在专门的 ETL 服务器上,数据先处理好再入仓。这种模式有几个明显问题:
- 转换逻辑用专有工具写,SQL 技能用不上
- 调试困难,中间结果难以查看
- 计算资源和存储资源分开,成本高
- 扩展能力受 ETL 服务器限制
现代 ELT(Extract → Load → Transform)
数据源 ──→ [提取+加载] ──→ 数据仓库 ──→ [转换]
↑ ↑
Fivetran/Airbyte dbt 在这里工作
先把原始数据 用 SQL 在仓库内转换
加载进来
ELT 范式下,原始数据先落仓,再用 SQL 在仓库内部完成所有转换。这成为可能的原因是:
- 云数仓(Snowflake、BigQuery、Redshift)计算能力极强,处理 SQL 极快
- 存储成本大幅下降,保留原始数据的代价可以接受
- SQL 工程师比 ETL 工具专家更容易找到
note 这不仅仅是工具换了
ELT 范式意味着数据转换的主战场从 ETL 工具转移到了数据仓库。 既然都在仓库里用 SQL,那就应该像管理代码一样管理 SQL。 dbt 就是这个思路的最佳实践体现。
Analytics Engineering:一个新角色的诞生
dbt 催生(或者说定义)了一个新的职业角色:分析工程师(Analytics Engineer)。
三种角色的对比
| 维度 | 数据工程师 | 数据分析师 | 分析工程师 |
|---|---|---|---|
| 核心技能 | Python/Java、分布式系统 | SQL、Excel、统计学 | SQL、数据建模、软件工程实践 |
| 主要工作 | 构建数据管道、维护基础设施 | 分析数据、制作报表 | 构建可靠的数据模型层 |
| 典型工具 | Spark、Kafka、Airflow | Excel、Tableau、SQL | dbt、SQL、Git、BI 工具 |
| 思维方式 | 系统思维、工程思维 | 业务思维、统计思维 | 工程思维 + 业务思维 |
分析工程师的价值在于:连接数据工程侧的管道与基础设施工作,以及数据分析侧的业务分析需求;具体技能边界因团队而异。
tip 职业发展建议
如果你是数据分析师,学习 dbt 和 Git 可以作为向分析工程师方向发展的准备;薪资和市场价值是否提升,取决于地区、岗位需求、经验及实际能力,并非学习这些工具即可保证。 如果你是数据工程师,理解 dbt 的理念能帮你更好地和分析团队协作,设计更好的数据架构。
dbt 解决的核心问题:SQL 项目工程化
dbt 把软件工程的几个核心实践引入了 SQL 工作流:
1. 依赖管理(Dependency Management)
传统方式:你需要手动记住表和表之间的依赖关系。
dbt 方式:用 ref() 函数声明依赖,dbt 自动构建 DAG(有向无环图)并按正确顺序执行。
-- 传统方式:手动记住 orders 依赖 raw_orders
SELECT * FROM raw_orders WHERE status = 'completed'
-- dbt 方式:ref() 声明依赖关系
SELECT * FROM {{ ref('stg_orders') }} WHERE status = 'completed'
2. 版本控制(Version Control)
dbt 项目就是一个普通的代码目录,天然适合用 Git 管理。配合 Git 可以实现:
- 代码历史追溯
- 分支开发
- Code Review
- 回滚
3. 测试(Testing)
数据质量不应该靠人肉检查,应该像单元测试一样自动化运行。
# schema.yml - 声明测试,就像写单元测试
models:
- name: orders
columns:
- name: order_id
tests:
- unique # 订单ID必须唯一
- not_null # 不能为空
- name: status
tests:
- accepted_values: # 只能是这几个值
values: ['placed', 'shipped', 'completed']
4. 文档(Documentation)
文档不是事后补的,而是和代码写在一起的。
models:
- name: orders
description: "订单事实表,一行代表一个订单,包含订单全生命周期的状态"
columns:
- name: order_id
description: "订单唯一标识,来源于业务系统的 orders.id"
5. 代码复用(DRY - Don't Repeat Yourself)
通过 Jinja 宏(Macro)封装重复的 SQL 逻辑,避免到处复制粘贴。
dbt Core vs dbt Cloud
学习时会遇到这两个版本,先搞清楚区别:
| 对比维度 | dbt Core | dbt Cloud |
|---|---|---|
| 费用 | 完全免费、开源 | 有免费额度,高级功能收费 |
| 运行方式 | 本地命令行运行 | Web 界面 + 托管运行环境 |
| 调度 | 需要自己集成(Airflow 等) | 内置调度器 |
| IDE | 用你自己的编辑器(VS Code 等) | 内置 Cloud IDE |
| 适合场景 | 学习、个人项目、自建技术栈 | 团队协作、不想维护调度基础设施 |
| 学习建议 | 先学这个 | 入门后再考虑 |
note 本系列的定位
本系列文档以 dbt Core 为主,因为它免费、开源,学习它意味着你真正理解了底层原理。 理解 dbt Core 有助于迁移到 dbt Cloud,但切换还涉及托管运行环境、连接与权限、调度和团队协作配置,并不只是界面的变化。
dbt 支持哪些数据仓库
dbt 通过**适配器(Adapter)**机制支持多种数据仓库。适配器把 dbt 的通用逻辑翻译成各个仓库的方言:
| 数据仓库 | 适配器包 | 成熟度 |
|---|---|---|
| BigQuery | dbt-bigquery | ⭐⭐⭐⭐⭐ 官方支持 |
| Snowflake | dbt-snowflake | ⭐⭐⭐⭐⭐ 官方支持 |
| Redshift | dbt-redshift | ⭐⭐⭐⭐⭐ 官方支持 |
| PostgreSQL | dbt-postgres | ⭐⭐⭐⭐⭐ 官方支持 |
| DuckDB | dbt-duckdb | ⭐⭐⭐⭐ 社区活跃 |
| ClickHouse | dbt-clickhouse | ⭐⭐⭐⭐ 社区活跃 |
| Spark | dbt-spark | ⭐⭐⭐⭐ 官方支持 |
| Trino/Presto | dbt-trino | ⭐⭐⭐ 社区维护 |
| Hive | dbt-hive | ⭐⭐⭐ 社区维护 |
| Doris | dbt-doris | ⭐⭐⭐ 社区维护 |
tip 学习环境推荐
- 本地开发:DuckDB(零配置,内存数据库,适合学习)
- 云端学习:BigQuery 或 Snowflake(都有免费额度)
- 企业环境:根据公司已有技术栈选择
dbt 的边界:它做什么,不做什么
很多人对 dbt 有误解,明确边界能帮你避免错误的期望:
dbt 做的事:
- 在数据仓库内部转换数据(Transform 层)
- 管理模型间的依赖关系
- 运行数据质量测试
- 生成数据文档和血缘图
- 管理 SQL 项目的工程化实践
dbt 不做的事:
- 不负责数据摄取(Extract & Load)—— 那是 Fivetran、Airbyte 的职责
- 不是调度工具 —— 需要 Airflow、dbt Cloud 或 cron 来调度 dbt 运行
- 不是 BI 工具 —— 数据可视化用 Tableau、Metabase、Looker 等
- 不处理流数据 —— 流处理用 Flink核心概念 或 Spark Streaming
warning 常见误区
dbt 不能替代 Airflow 等调度工具。dbt 本身只是"把模型跑一遍",它不知道什么时候该跑、失败了怎么重试、依赖其他任务完成才能运行等逻辑。 这些编排逻辑需要 Airflow(或 dbt Cloud 的调度功能)来实现。 见 10-dbt与调度集成。
总结:为什么值得学 dbt
- 从混乱到工程化:把 SQL 脚本混乱的现状转变为有结构、可测试、有文档的工程项目
- 职业价值:分析工程师方向值得结合目标市场的招聘需求评估;“Analytics Engineer 是 2023-2025 年数据领域增速最快的岗位之一”在本文中仅作为待验证的市场假设,不作为已证实结论。
- 低学习门槛:核心是 SQL,不需要学新的编程语言
- 广泛采用:Airbnb、GitLab、JetBlue、Shopify 等公司都在生产环境使用 dbt
- 活跃生态:dbt-utils、dbt-expectations 等包极大扩展了 dbt 的能力
下一步
现在你已经理解了 dbt 的"为什么",下一篇开始动手:
02-dbt安装与项目初始化 - 安装 dbt、创建第一个项目、连接数据库
最后更新:2026-03-18
#dbt #Analytics-Engineering #ELT #数据转换 #现代数据栈
info 前置知识
- 了解 ETL/ELT 的基本概念(数据从哪里来、到哪里去)
- 有 SQL 基础(能写 SELECT、JOIN、聚合查询)
- 知道什么是数据仓库(数仓是做什么的)
掌握检查
- [ ] 能用一句话说清楚 dbt 是什么(核心是"把 SELECT 变成数据库对象",而不是"又一个 ETL 工具")
- [ ] 能解释 ELT 和 ETL 的区别:dbt 处理的是 Transform 阶段,Extract 和 Load 是其他工具的事
- [ ] 能说出 dbt 引入版本控制(Git)对数据团队带来的核心价值(可追溯、可回滚、可协作)
- [ ] 理解 Analytics Engineer 角色的定位:介于数据工程师和数据分析师之间,既懂 SQL 又理解工程化
实践练习
基础题:在你目前的工作或学习项目中,找出一个"手写 SQL 脚本反复执行"的数据转换场景,思考如果用 dbt 管理它,会解决哪些具体的痛点(版本管理、依赖管理、可测试性中至少说出 2 个)。
进阶题:ELT 架构把数据先 Load 进数仓再 Transform,而传统 ETL 是先 Transform 再 Load。结合你了解的场景,说出这两种方式各自适合什么情况,以及云数仓(Snowflake、BigQuery)的出现为什么让 ELT 成为主流。