3. dbt核心概念

在金融数据治理场景中,dbt 不只是一个 SQL 执行器,它更像一套“数据资产装配线”。模型、源、种子、快照、宏、测试、文档与项目结构,分别承担了数据加工、数据接入、静态映射、历史追踪、逻辑复用、质量校验、元数据沉淀和工程组织八类职责。理解它们之间的边界与协作方式,是后续做测试治理和文档治理的前提。

一、核心原理:八类对象各司其职

dbt 项目中的每一类对象,本质上都在回答一个不同的问题:数据从哪里来、如何变换、如何复用、如何验证、如何解释、如何组织。下面这张结构关系图展示了八类核心对象在 dbt 项目中的位置与数据流向。

dbt 核心对象与数据流关系 源 sources 原始金融数据表 种子 seeds 静态映射/码表 快照 snapshots SCD2 历史追踪 模型 models staging / marts SQL + 配置 宏 macros Jinja 逻辑复用 测试 tests 质量校验 文档 docs 元数据与血缘 项目结构 dbt_project.yml

从图中可以看出,源和种子是数据入口,快照负责历史留存,模型是核心加工单元,宏提供逻辑复用,测试和文档分别从质量和元数据两个维度对模型进行约束与说明,而项目结构则决定了这些对象如何被组织和发现。

二、方法流程:从原始数据到可信资产

在金融数据项目中,一个典型的 dbt 工作流如下:

  1. 定义源:在 sources.yml 中声明上游业务库表,如 core_banking.account、trade.order,并配置新鲜度检查。
  2. 加载种子:将行业分类码、币种映射、机构对照表等静态数据以 CSV 形式放入 seeds/,通过 dbt seed 加载。
  3. 建立快照:对客户风险等级、账户状态等需要追踪历史变化的表配置 snapshot,采用 timestamp 或 check 策略。
  4. 编写模型:按 staging → intermediate → marts 分层,staging 做清洗与重命名,marts 做业务聚合与宽表输出。
  5. 抽取宏:将重复的利息计算、汇率转换、日期维度生成等逻辑封装为宏,减少复制粘贴。
  6. 配置测试:对主键、外键、枚举值、非空、唯一性、接受值范围等设置通用测试与自定义测试。
  7. 生成文档:在 YAML 中补充模型描述、字段说明、负责人和标签,通过 dbt docs generate 产出可浏览的血缘图。

关键命令示例:

dbt seed --select currency_mapping
dbt snapshot --select customer_risk_snapshot
dbt run --select staging.core_banking+
dbt test --select marts.finance
dbt docs generate && dbt docs serve

三、案例场景:金融数据治理中的对象协作

假设某银行需要构建“客户资产视图”。源系统包括核心银行系统、理财系统和信贷系统。种子表提供产品类别映射,快照表追踪客户风险等级变化,模型层先做 staging 清洗,再在 marts 层汇总总资产、总负债和净值。宏用于统一计算年化收益率,测试用于校验客户号唯一性和资产金额非负,文档则记录每个字段的业务含义和监管口径。

对象 金融场景示例 治理关注点
源 sources 核心系统客户表、交易流水表 新鲜度、权限、上游变更通知
种子 seeds 币种代码、产品分类、机构对照 版本控制、变更审计
快照 snapshots 客户风险等级、账户状态历史 SCD2 准确性、时间戳边界
模型 models 客户资产宽表、产品收益汇总 分层规范、命名一致、口径统一
宏 macros 利息计算、汇率转换、日期维度 可测试性、参数校验、复用边界
测试 tests 客户号唯一、金额非负、枚举合法 覆盖率、失败告警、阻断策略
文档 docs 字段业务含义、监管口径、负责人 完整性、时效性、血缘可追溯

四、误区与复盘:常见治理陷阱

误区一:把种子当生产表用。种子适合静态码表,不适合频繁更新的业务数据。若将每日汇率放入种子,会导致版本膨胀和加载延迟。

误区二:快照策略选错。金融场景中客户风险等级变化必须用 timestamp 策略精确到生效时间,若用 check 策略可能漏掉同一天多次变更。

误区三:测试只做 not_null。金融数据对唯一性、外键、枚举和数值范围要求极高,仅做非空测试无法发现重复入账或金额异常。

误区四:文档与模型脱节。模型字段变更后未同步更新 YAML,导致血缘图和字段说明失真,影响监管报送和下游信任。

复盘建议:在项目初期就建立 models/staging、models/intermediate、models/marts 三层目录规范,并在 dbt_project.yml 中统一配置物化策略、标签和测试阈值。将宏按业务域拆分到 macros/finance/、macros/utils/,避免单一宏文件过度膨胀。测试和文档应作为模型交付的一部分,而不是事后补做。