跳转到内容

dbt教程

简单来说,dbt 的核心理念是 “用软件工程的思想做数据转换”。它不负责数据的搬运(Extract/Load),只负责数据的转换(Transform),是现代数据栈(Modern Data Stack)中 ELT 模式的那个 T

在传统的 ETL 流程中,数据逻辑往往埋藏在复杂的存储过程或可视化工具的配置中,难以版本控制和测试。

dbt 提出了一个全新的范式:

  • SQL 为王: 你只需要编写标准的 SELECT 语句,dbt 负责将其转化为数据仓库中的表(Table)或视图(View)。
  • 软件化管理: 引入了代码版本控制(Git)、自动化测试、环境隔离(开发/生产)以及文档自动生成。

要快速上手,你需要理解以下四个支柱概念:

在 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(有向无环图)
  • 优势: 它保证了执行顺序——先运行上游表,再运行下游表。

dbt 将数据质量监控集成到了开发中。

  • Schema Test: 在 YAML 中配置简单的约束(如 unique, not_null, accepted_values)。
  • Data Test: 编写自定义 SQL,如果查询返回结果,则测试失败。

用于处理 SCD(缓慢变化维)。它可以记录数据随时间的变化情况,这在需要追溯历史状态时非常有用。


3. Dbt 的工作流程(从开发到部署)

Section titled “3. Dbt 的工作流程(从开发到部署)”

作为开发人员,你可以将 dbt 的开发流程类比为应用开发:

  1. 初始化: dbt init 创建项目结构。
  2. 定义数据源 (Sources): 在 YAML 中声明原始数据的位置。
  3. 编写模型 (Models):
    • Staging 层: 对原始数据进行清洗、重命名(1:1 映射)。
    • Intermediate 层: 处理复杂的业务逻辑、Join 操作。
    • Mart 层: 面向报表或业务终端的最终宽表。
  4. 编译与运行:
    • dbt compile:将 Jinja 模板和 SQL 转化为纯 SQL。
    • dbt run:在数据库中执行 SQL,生成表。
  5. 验证: dbt test 运行测试用例。
  6. 文档: 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') }}


[!question] 下一步建议 为了让你真正掌握,我建议我们进行以下操作: 你想让我为你演示如何配置一个标准的 dbt profiles.yml 文件以连接到你的数据库(如 PostgreSQL, Snowflake, BigQuery 等),还是想看一个具体的从原始表到最终报表层的模型演练?