Chapter 01

dbt 与分析工程

理解 ETL 到 ELT 的范式转变,分析工程师的诞生,以及 dbt 如何重新定义数据转换

1.1 传统 ETL 的困境

在云数据仓库普及之前,数据团队面临一个根本性约束:存储和计算都很昂贵。传统的数据处理范式是 ETL——先在数据进入仓库之前,在单独的 ETL 服务器上完成转换。

⚠️

传统 ETL 的问题 转换逻辑分散在各种 ETL 工具(Informatica、SSIS)中;SQL 脚本没有版本控制;没有测试框架;文档靠手动维护;数据工程师与分析师之间协作困难;重跑历史数据成本极高。

💡

ELT 的核心转变 先将原始数据 Load 进云仓库,再利用仓库自身的强大计算能力做 Transform。Snowflake、BigQuery、Redshift 让 SQL 转换变得极快且廉价,这使得 ELT 成为现代数据栈的首选范式。

ETL vs ELT 对比

维度ETLELT
转换时机加载前(在 ETL 服务器)加载后(在数据仓库内)
工具Informatica, SSIS, Talenddbt, SQL, Python
原始数据保留通常丢弃保留全部原始数据
版本控制困难(专有格式)容易(纯文本 SQL/Git)
扩展性依赖 ETL 服务器性能随仓库线性扩展
适用场景敏感数据加密/脱敏、遗留系统现代云数据仓库、大规模分析

1.2 分析工程师的诞生

ELT 范式的崛起,催生了一个新职位:分析工程师(Analytics Engineer)。这个角色介于数据工程师和数据分析师之间,专注于在数据仓库内构建可信、可复用的数据模型。

📌

分析工程师的职责定位 数据工程师构建数据管道(Ingestion);分析工程师构建转换层(Transformation),将原始数据变成干净的、文档完善的、经过测试的数据集;数据分析师和业务人员在此基础上做分析和可视化。dbt 正是为分析工程师量身定制的工具。

1.3 dbt 解决了什么问题

dbt 的核心理念是:将软件工程的最佳实践带入数据转换领域。在 dbt 出现之前,数据仓库的转换层往往是混乱的——没有人真正知道一张 BI 报表的数据从哪来、经过了什么逻辑。

1.4 dbt Core vs dbt Cloud

特性dbt Core(开源)dbt Cloud(托管)
价格免费,开源免费层 + 付费版($50+/用户/月)
运行方式本地 CLI 命令浏览器 IDE + 云端执行
调度需自建(Airflow/Cron)内置任务调度器
CI/CD需自建 GitHub Actions内置 Slim CI
文档托管需自行部署内置托管
适用自托管、灵活定制团队协作、快速上手
🎯

本教程使用 dbt Core 所有示例均基于 dbt Core(命令行),不依赖 dbt Cloud。dbt Core 涵盖了所有核心功能,且完全免费。学会 dbt Core 后,dbt Cloud 只是多了一个 UI 界面。

1.5 安装 dbt

dbt 通过 Python pip 安装。不同的数据仓库需要安装对应的适配器(adapter),每个适配器已包含 dbt Core 本身。

BASH# 推荐:使用虚拟环境隔离
python -m venv dbt-env
source dbt-env/bin/activate  # Windows: dbt-env\Scripts\activate

# 安装 dbt + DuckDB 适配器(本地开发,无需云账号)
pip install dbt-core dbt-duckdb

# 安装 dbt + BigQuery 适配器
pip install dbt-core dbt-bigquery

# 安装 dbt + Snowflake 适配器
pip install dbt-core dbt-snowflake

# 安装 dbt + Redshift 适配器
pip install dbt-core dbt-redshift

# 安装 dbt + PostgreSQL 适配器
pip install dbt-core dbt-postgres

# 验证安装
dbt --version
🦆

推荐从 DuckDB 开始学习 DuckDB 是一个嵌入式分析数据库,无需安装任何服务,直接在本地文件上运行,完美适合 dbt 学习。本教程前几章均使用 DuckDB 作为演示后端。

1.6 初始化项目:dbt init

一个 dbt 项目就是一个目录,包含模型、测试、宏等文件。用 dbt init 快速生成项目骨架:

BASH# 初始化名为 my_analytics 的项目
dbt init my_analytics

# 交互式选择数据库类型
# Which database would you like to use?
# [1] duckdb  [2] bigquery  [3] snowflake ...

cd my_analytics
ls -la

项目目录结构如下:

TREEmy_analytics/
├── dbt_project.yml        # 项目配置(名称、版本、模型路径等)
├── profiles.yml           # 数据库连接配置(通常放在 ~/.dbt/)
├── models/                # SQL 模型文件(核心)
│   └── example/
│       ├── my_first_dbt_model.sql
│       └── schema.yml
├── tests/                 # 自定义测试 SQL
├── macros/                # 可复用的 Jinja 宏
├── seeds/                 # CSV 文件(直接加载为表)
├── snapshots/             # SCD Type 2 快照
├── analyses/              # 分析用 SQL(不执行为模型)
└── target/                # 编译输出(自动生成,不提交 Git)

1.7 profiles.yml 连接配置

profiles.yml 定义如何连接到数据库。默认路径是 ~/.dbt/profiles.yml(全局共享),也可以放在项目根目录。

YAML# ~/.dbt/profiles.yml

# DuckDB(本地文件,零配置)
my_analytics:
  target: dev
  outputs:
    dev:
      type: duckdb
      path: ./dev.duckdb      # 数据库文件路径
      threads: 4

---
# BigQuery(使用服务账号)
my_analytics:
  target: dev
  outputs:
    dev:
      type: bigquery
      method: service-account
      project: my-gcp-project
      dataset: dbt_dev
      keyfile: /path/to/keyfile.json
      threads: 4
      timeout_seconds: 300
    prod:
      type: bigquery
      method: service-account
      project: my-gcp-project
      dataset: dbt_prod
      keyfile: /path/to/prod-keyfile.json
      threads: 8
BASH# 测试连接是否成功
dbt debug

# 输出示例
# Connection test: [OK connection ok]

1.8 dbt_project.yml 项目配置

dbt_project.yml 是项目的核心配置文件,定义项目名称、模型路径、默认物化方式等:

YAML# dbt_project.yml
name: my_analytics
version: '1.0.0'
config-version: 2

# 指定 profiles.yml 中的 profile 名称
profile: my_analytics

# 文件路径配置
model-paths: ["models"]
analysis-paths: ["analyses"]
test-paths: ["tests"]
seed-paths: ["seeds"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]

# 模型默认配置
models:
  my_analytics:
    # staging 层:轻量视图
    staging:
      +materialized: view
      +schema: staging
    # marts 层:持久化表
    marts:
      +materialized: table
      +schema: marts

1.9 名词解释

📌

本章小结
云数据仓库的普及推动了从 ETL 到 ELT 的范式转变,催生了分析工程师职位。dbt 是 ELT 转换层的标准工具,将软件工程的版本控制、测试、文档最佳实践带入数据建模。

dbt Core 免费开源,通过 pip install dbt-core dbt-{adapter} 安装。dbt init 创建项目骨架,profiles.yml 配置数据库连接,dbt debug 验证连接。本教程推荐从 DuckDB 适配器开始学习,零服务器开销,快速上手。