













从此篇开始,汇总dbt项目的常见问题,以此来巩固dbt的基础知识。
答:不是固定的,但遵循最佳实践。
以 stg_customers.sql 为例:
WITH source AS (
SELECT *
FROM {{ source('business_db', 'customers') }}
)
SELECT
customer_id,
customer_name,
-- ... 其他字段
'business_db' AS source_system,
{{ get_current_load_date() }} AS load_date
FROM source
| 部分 | 作用 | 是否必须 |
|---|---|---|
WITH source AS (...) CTE |
用 {{ source() }} 引用源数据,解耦 |
推荐,非必须 |
| 明确列出所有字段 | 避免上游表结构变动带来意外 | 推荐 |
source_system 列 |
标记数据来源系统 | 按需添加 |
load_date 列 |
通过 macro 记录加载时间 | 按需添加 |
stg_<表名>schema.yml 写测试和文档答:会,但具体是表还是视图取决于 materialization 配置。
stg_customers.sql
↓
dbt compile(编译,展开 Jinja)
↓
生成可执行 SQL
↓
dbt run(执行)
↓
在数据仓库中创建对象
编译后的 SQL 大致长这样:
WITH source AS (
SELECT *
FROM business_db.dbo.customers
)
SELECT
customer_id,
customer_name,
-- ...
'business_db' AS source_system,
CURRENT_DATE AS load_date
FROM source
在 dbt_project.yml 中:
models:
dbt_sqldv:
staging:
+materialized: table # 以表的形式落地
+database: stage_db
+schema: dbo
staging 层常见做法:数据量小用 view(省空间),数据量大或下游频繁查询用 table(加速)。本项目用的是 table。
答:完全正确。这就是 ELT 中的 T(转换 + 搬运)。
business_db.dbo.customers ← 源数据库(OLTP)
│ source() 引用
▼
stg_customers.sql ← dbt 模型
│ dbt run 写入
▼
stage_db.dbo.stg_customers ← staging 层
| 配置位置 | 配置项 | 值 | 含义 |
|---|---|---|---|
schema.yml sources |
database |
business_db |
数据来自这个库 |
dbt_project.yml staging |
+database |
stage_db |
数据写入这个库 |
dbt_project.yml staging |
+materialized |
table |
以表的形式落地 |
dbt_project.yml staging |
+schema |
dbo |
放在 dbo 下 |
典型的 ELT 模式:数据已经在同一实例的不同库中,dbt 负责 SQL 转换和落地。
答:用 --select 参数。
# 只运行 stg_customers 这一个模型
dbt run --select stg_customers
# 运行 stg_customers 及其所有下游依赖(+ 号在右)
dbt run --select stg_customers+
# 运行 stg_customers 及其所有上游依赖(+ 号在左)
dbt run --select +stg_customers
# 运行整个 staging 目录
dbt run --select staging
# 只编译不执行(查看生成的 SQL)
dbt compile --select stg_customers
# 运行该模型的测试
dbt test --select stg_customers
# 跑依赖 + 跑自己 + 跑测试(一条龙)
dbt build --select +stg_customers
编译后的 SQL 可以在
target/compiled/目录下找到,调试时很有用。
答:dbt 会自动构建 DAG(有向无环图),按拓扑顺序执行——上游先跑,下游后跑。
第 1 批:Staging 层(3 个,可并行)
stg_customers、stg_orders、stg_products第 2 批:Core 层 Hub(3 个,可并行)
hub_customer ← stg_customershub_order ← stg_ordershub_product ← stg_products第 3 批:Core 层 Satellite + Link(4 个,可并行)
sat_customer ← hub_customer + stg_customerssat_product ← hub_product + stg_productssat_order_details ← hub_order + stg_orderslink_order_customer_product ← 三个 hub + stg_orders第 4 批:Mart 层维度表(3 个,可并行)
dim_customer ← hub_customer + sat_customerdim_product ← hub_product + sat_productdim_date(独立)第 5 批:Mart 层事实表
fct_order第 6 批:Mart 层宽表
dws_order_widedbt 同一批次内无依赖的模型可以并行执行,并行度由 profiles.yml 中的 threads 控制:
dev:
threads: 1 # 当前是串行,调大可加速
dbt docs generate && dbt docs serve
生成网页版的 DAG 图,所有依赖关系一目了然。
答:先在 SQL Server 中手动建好三个数据库,再在 dbt 中通过 +database 配置分层写入。dbt 本身不会自动创建数据库。
dbt-core 没有 CREATE DATABASE 的原生能力,它只能在已经存在的数据库内部创建 schema、table、view 等对象。因此,stage_db、core_db、mart_dw 这三个物理库,必须先在 SQL Server 中手动建好:
-- 在 SQL Server 中手动执行
CREATE DATABASE stage_db;
CREATE DATABASE core_db;
CREATE DATABASE mart_dw;
在 dbt_project.yml 中,按目录层级分别指定 +database 和 +schema:
models:
dbt_sqldv:
staging:
+materialized: table
+database: stage_db # 写入 stage_db
+schema: dbo
core:
+materialized: table
+database: core_db # 写入 core_db
+schema: dbo
mart:
+materialized: table
+database: mart_dw # 写入 mart_dw
+schema: dbo
business_db(源库,手动建)
│
▼ source() 引用
stage_db(手动建) ← dbt 建表/视图
│
▼ ref() 引用
core_db(手动建) ← dbt 建表/视图
│
▼ ref() 引用
mart_dw(手动建) ← dbt 建表/视图
这次用对话式 AI 辅助搭 dbt 数仓,几个比较深的体会:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。