dbt教程
1. 什么是 dbt?为什么需要它?
Section titled “1. 什么是 dbt?为什么需要它?”简单来说,dbt 的核心理念是 “用软件工程的思想做数据转换”。它不负责数据的搬运(Extract/Load),只负责数据的转换(Transform),是现代数据栈(Modern Data Stack)中 ELT 模式的那个 T。
在传统的 ETL 流程中,数据逻辑往往埋藏在复杂的存储过程或可视化工具的配置中,难以版本控制和测试。
dbt 提出了一个全新的范式:
- SQL 为王: 你只需要编写标准的
SELECT语句,dbt 负责将其转化为数据仓库中的表(Table)或视图(View)。 - 软件化管理: 引入了代码版本控制(Git)、自动化测试、环境隔离(开发/生产)以及文档自动生成。
2. 核心概念解析
Section titled “2. 核心概念解析”要快速上手,你需要理解以下四个支柱概念:
2.1. A. 模型 (Models)
Section titled “2.1. A. 模型 (Models)”在 dbt 中,每一个 .sql 文件就是一个模型。
- 本质: 模型就是一条
SELECT语句。 - 物化配置 (Materialization): 你可以通过配置决定这个 SQL 运行后是生成一个
Table(实体表)、View(视图)、还是Incremental(增量更新表)。
2.2. B. ref 函数:依赖管理的精髓
Section titled “2.2. B. ref 函数:依赖管理的精髓”这是 dbt 最强大的地方。你不再需要写死表名(如 FROM raw_data.users),而是使用 FROM {{ ref('stg_users') }}。
- 作用: dbt 会自动解析模型之间的依赖关系,并生成一个 DAG(有向无环图)。
- 优势: 它保证了执行顺序——先运行上游表,再运行下游表。
2.3. C. 测试 (Tests)
Section titled “2.3. C. 测试 (Tests)”dbt 将数据质量监控集成到了开发中。
- Schema Test: 在 YAML 中配置简单的约束(如
unique,not_null,accepted_values)。 - Data Test: 编写自定义 SQL,如果查询返回结果,则测试失败。
2.4. D. 快照 (Snapshots)
Section titled “2.4. D. 快照 (Snapshots)”用于处理 SCD(缓慢变化维)。它可以记录数据随时间的变化情况,这在需要追溯历史状态时非常有用。
3. Dbt 的工作流程(从开发到部署)
Section titled “3. Dbt 的工作流程(从开发到部署)”作为开发人员,你可以将 dbt 的开发流程类比为应用开发:
- 初始化:
dbt init创建项目结构。 - 定义数据源 (Sources): 在 YAML 中声明原始数据的位置。
- 编写模型 (Models):
- Staging 层: 对原始数据进行清洗、重命名(1:1 映射)。
- Intermediate 层: 处理复杂的业务逻辑、Join 操作。
- Mart 层: 面向报表或业务终端的最终宽表。
- 编译与运行:
dbt compile:将 Jinja 模板和 SQL 转化为纯 SQL。dbt run:在数据库中执行 SQL,生成表。
- 验证:
dbt test运行测试用例。 - 文档:
dbt generate-docs自动根据模型注释和依赖关系生成交互式文档网页。
4. 复杂概念深度剖析:Jinja 与 宏 (Macros)
Section titled “4. 复杂概念深度剖析:Jinja 与 宏 (Macros)”dbt 引入了 Jinja 模板引擎,让 SQL 具备了编程能力。
- Jinja: 你可以在 SQL 中使用
if判断、for循环。- 场景: 如果你需要对 10 个不同的支付方式进行求和,不再需要写 10 行相似 of SQL,用一个循环即可。
- Macros (宏): 类比为函数。你可以编写一段可复用的逻辑(如:将美分转为美元、计算年龄),在多个模型中调用。
-- 一个简单的宏示例{% macro to_dollars(column_name) %} round({{ column_name }} / 100, 2){% endmacro %}
-- 在模型中使用SELECT id, {{ to_dollars('amount_cents') }} as amount_usd FROM {{ ref('payments') }}5. 开发建议与最佳实践
Section titled “5. 开发建议与最佳实践”[!question] 下一步建议 为了让你真正掌握,我建议我们进行以下操作: 你想让我为你演示如何配置一个标准的 dbt profiles.yml 文件以连接到你的数据库(如 PostgreSQL, Snowflake, BigQuery 等),还是想看一个具体的从原始表到最终报表层的模型演练?