dbt(data build tool)是由 dbt Labs(原 Fishtown Analytics)开发的开源数据转换工具,定位在 ELT 管道中的 “T“(Transform)环节。它的核心思路很简单:把 SQL 当作软件代码来管理——分析师和工程师用 SQL 编写数据转换逻辑(称为”模型”),dbt 负责依赖解析、按 DAG 顺序执行、自动生成数据测试与文档。它解决的是数据团队最普遍的痛点:成百上千条 SQL 脚本散落在本地和编辑器里,没有版本控制、没有测试、没有血缘关系,改一个口径无法评估下游影响。截至 2025 年 2 月,dbt Core 最新正式版为 1.9.0(2024 年 10 月发布),适配 Snowflake、BigQuery、Redshift、PostgreSQL 等 40+ 数据平台。本文从安装配置、快速上手、核心能力、生产部署、选型对比到面试题,完整带你上手 dbt。
对 AI 从业者而言,dbt 是打通“数据仓库 → 特征/训练数据集 → 业务指标”的标准工程化工具,掌握它意味着你具备了现代数据团队不可或缺的转换层设计与数据质量治理能力。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 dbt:SQL 脚本失控 → 把转换层工程化
传统数据转换工作的痛点很明确。业务分析团队通常维护着几十到几百条 SQL 脚本,散落在 Navicat、DataGrip、Jupyter 甚至聊天记录里,没有版本控制,更谈不上 Code Review。脚本之间通过物理表名字符串相互引用,一旦上游表改名或字段口径调整,下游报表在凌晨跑数时才会静默报错。另一个痛点是重复劳动:每个项目都要重写“去重、类型转换、枚举映射”这类样板 SQL,且没有任何数据质量保障手段——唯一性假设、非空假设全靠人工抽查。
dbt 将上述流程工程化。你把每条转换逻辑写成一个 .sql 模型文件放进项目,通过 ref() 和 source() 声明模型间依赖,dbt 静态解析后自动生成血缘 DAG,并保证按拓扑序执行。它内置 unique、not_null、accepted_values、relationships 四类开箱即用的数据测试,也支持用 SQL 写自定义测试;dbt docs 自动生成数据字典和血缘图。增量物化(incremental)和大表快照(snapshot)能力让全量重算成为过去式。相对于同类工具,dbt 的气质是“专一且克制”——它只做 T,不做数据抽取,也不做任务调度,这把学习门槛压得很低,分析师一天就能上手,同时与 Airflow 等调度器天然互补。
安装与环境配置:3 步就绪
步骤一:准备 Python 3.8+ 虚拟环境。 dbt Core 是 Python 包,建议在虚拟环境中安装,避免污染系统 Python。
步骤二:安装数据库适配器。 dbt 1.8 起核心与适配器分离安装——你不需要单独装 dbt-core,安装适配器时会自动拉取匹配的核心版本。选择与你数仓对应的适配器即可。
步骤三:配置 profiles.yml 并验证。 dbt 通过 ~/.dbt/profiles.yml 文件读取数据库连接信息,配置好之后用 dbt debug 验证连通性。
# 1) 创建并激活虚拟环境python3 -m venv .venvsource .venv/bin/activate # 2) 安装数据库适配器(Snowflake 用 dbt-snowflake,BigQuery 用 dbt-bigquery)pip install dbt-postgres # 3) 验证安装dbt --version # 4) 编辑 ~/.dbt/profiles.yml,添加目标数据库连接cat >> ~/.dbt/profiles.yml << 'EOF'my_project: target: dev outputs: dev: type: postgres host: localhost port: 5432 user: postgres password: secret dbname: analytics schema: public threads: 4EOF # 5) 验证数据库连接dbt debug
快速上手:10 分钟跑通官方示例
最快路径是使用 dbt Labs 官方的 jaffle_shop 示例项目——一个模拟电商销售数据的入门项目,包含种子数据、模型、测试和文档。克隆到本地、配置好 profiles.yml 后,按顺序执行四条命令即可看到完整效果。该项目的 dbt build 会依次完成:加载 CSV 种子 → 构建全部模型 → 运行全部测试,一步到位。
1. 克隆仓库:git clone https://github.com/dbt-labs/jaffle_shop.git
2. 进入项目目录,确认 profiles.yml 已按上文配置好目标数据库
3. 运行 dbt debug 验证连接(出现 "All checks passed!" 说明成功)
4. 运行 dbt build,观察控制台输出的模型构建顺序与测试结果
5. 运行 dbt docs generate && dbt docs serve,浏览器打开本地 8080 端口,查看自动生成的血缘 DAG 与数据字典
进阶技巧:在 dbt build --select stg_customers+ 中,+ 运算符表示“包含该模型及其所有下游模型”,只构建受影响的子图,这是日常迭代最常用的选择语法。
git clone https://github.com/dbt-labs/jaffle_shop.gitcd jaffle_shopdbt debug # 验证数据库连接dbt build # 一次完成 seed + model + testdbt docs generate && dbt docs serve # 启动本地文档服务
核心能力详解:5 大支柱
支柱一:模型与依赖管理(ref / source)。 模型是 dbt 的基本单元,一个 .sql 文件就是一个模型。ref('model_name') 引用项目内其他模型,source('schema', 'table') 声明对数据仓库中原始表的依赖。dbt 静态解析这些函数调用,自动构建 DAG 并决定执行顺序,彻底告别手工排序。
支柱二:数据质量测试。 在 models/schema.yml 中声明测试,dbt 会为每条断言生成 SQL 去验证数据。内置测试之外,你还可以用 SQL 编写自定义单一测试(singular tests),或在宏中封装带参数的通用测试。
支柱三:文档与血缘(Lineage)。 dbt docs generate 会解析所有模型、测试和 source,生成包含列级描述和模型间依赖关系的 catalog 文件;dbt docs serve 在本地启动浏览器界面,展示可交互的血缘 DAG,并支持按模型名搜索定位。
支柱四:增量物化与快照。 将模型配置为 materialized='incremental' 并配合 is_incremental() 条件,后续运行只处理新增数据;快照(snapshot)则在表上实现 Type 2 渐变维度,每次源数据变化自动新增一行,并用 dbt_valid_from / dbt_valid_to 记录有效时间范围。
支柱五:宏、包与语义层。 Jinja 模板让 SQL 具备编程能力——写一次宏,全项目复用;packages.yml 可安装 dbt 社区的数千个开源包(如 dbt_utils、dbt_expectations);dbt 1.6 起引入语义层(Semantic Layer),用声明式方式定义指标,统一指标口径供下游 BI 工具消费。
-- models/staging/stg_customers.sqlSELECT id AS customer_id, first_name, last_nameFROM {{ source('raw', 'customers') }} -- models/marts/dim_customers.sqlSELECT customer_id, first_name || ' ' || last_name AS full_nameFROM {{ ref('stg_customers') }}
# models/schema.ymlversion: 2 sources: - name: raw schema: raw_data tables: - name: customers models: - name: stg_customers columns: - name: customer_id tests: - unique - not_null
生产部署与监控:从上线到运维
方式一:dbt Cloud 托管。 官方 SaaS 方案,免去基础设施维护。在 Cloud 中配置仓库连接后,可创建定时作业(每小时/每天)或在 PR 时触发 CI 作业,CI 中对变更模型运行 dbt build --select state:modified+,只构建受影响的子图。Cloud 自带 Run History、日志检索、失败告警(Slack/Email)和环境变量管理,适合不想自建调度或缺乏运维团队的团队。
方式二:dbt Core + 外部调度器自建。 主流的开源组合是 dbt Core + Airflow/Dagster。你需要在调度器中定义每日任务,通过 bash_command 或对应 Operator 调用 dbt build,并处理依赖失败重试。自建方案的灵活性最高,但需要自己实现 CI/CD、日志留存和告警。
可观测性。 每次运行后,dbt 会生成 target/manifest.json(项目元数据)和 target/run_results.json(运行详情),可解析后写入元数据表实现“模型血缘 + 运行历史 + 测试结果”的可视化看板。生产环境应关注三类指标:模型运行时长与失败率、测试通过率、增量模型的数据量变化。建议在 CI 流水线中对每个 PR 强制运行 dbt test --select state:modified+,把数据质量问题拦截在合并之前。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>把 dbt 当 EL 工具用:dbt 只做 T(转换),抽取和加载要交给 Fivetran/Airbyte 等上游工具或自建同步任务,不要在模型里写爬虫或 API 调用逻辑。</li><li>增量模型不配 is_incremental() 和 unique_key:增量物化要求你显式设计增量策略,否则每次运行都会全量扫描重建,既慢又容易产生重复数据。</li><li>硬编码表名绕过 ref():直接写 schema.table 会让 dbt 丢失血缘和依赖信息,换环境时必然报错;一切引用都应通过 ref() 或 source()。</li><li>把权限控制寄托在 dbt 上:dbt 是 SQL 转换器,不提供行级权限和字段级脱敏,安全策略必须由数仓(如 Snowflake 的行访问策略、BigQuery 的列级 IAM)实现。</li></ul>
| 维度 | dbt | SQLMesh | Dataform | Airflow |
|---|---|---|---|---|
| 定位 | 数据转换层(T),专注 SQL 建模与测试 | 数据转换 + 物理数据仓库自动管理 | Google Cloud 生态内的数据转换工作流 | 通用工作流编排与调度平台 |
| 编排范式 | SQL 模型 + ref() 依赖解析生成 DAG | SQL/Python 模型,Plan 驱动变更与回溯 | SQL 模型,Git 化工作流 | Python DAG 中显式定义任务依赖 |
| 类型约束 | 模型契约(contracts)声明列名与数据类型 | 自动检测 schema 变更并评估下游影响 | 无内建模型契约 | 无数据模型概念 |
| 学习曲线 | ★★☆(有 SQL 基础当天上手) | ★★★(需理解物理存储与 Plan 机制) | ★★☆(但绑定 Google 生态) | ★★★★(需 Python 与运维知识) |
| 生态集成 | 40+ 适配器(Snowflake/BigQuery/Redshift 等) | 主要云数仓(BigQuery、Snowflake、Databricks) | BigQuery 深度集成,其他平台支持弱 | 2000+ 内置算符,连接任意系统 |
| 生产部署 | dbt Cloud 托管或自建 + Airflow 调度 | 开源版自建 + 商业版 Tobiko Cloud | Google Cloud 全托管(免运维) | 自建部署(Docker/K8s)为主 |
| License | Apache 2.0(Core 开源) | Apache 2.0 | 闭源(Google Cloud 服务) | Apache 2.0 |
| 适合谁 | 数据分析师/工程师,专注 ELT 转换层 | 数据平台团队,需要自动物理层优化 | BigQuery 用户,追求全托管低成本 | 平台团队,需编排跨系统复杂工作流 |
选型建议:团队核心诉求是把“简单 SQL 转换 + 测试 + 文档”工程化,dbt 是门槛最低、社区最成熟的选择;已在 Google Cloud 全家桶且不想自管基础设施,优先 Dataform;需要物理层自动优化和精细的变更影响分析,评估 SQLMesh;工作流涉及数据摄取、ML 训练、报表投递等多系统编排时,用 Airflow 做调度底座、dbt 做转换层,两者是互补关系而非竞争。
版本迭代
dbt 自 1.0 起采用季度级语义化版本发布,主线是从“纯 SQL 转换工具”演进为“分析工程平台”——1.3 引入 Python 模型打破 SQL 边界,1.5 推出 dbt Mesh 支持多项目协作,1.6 加入语义层统一指标口径,1.8 打通本地 CLI 与云平台,1.9 强化项目元数据浏览。核心 API 在 1.0 后保持稳定,升级成本较低。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| 1.0.0 | 2021-12 | 首个语义化正式版 | API 冻结与长期稳定承诺,适配器生态标准化 |
| 1.3.0 | 2022-10 | Python 模型支持 | 可用 Python 编写数据转换逻辑,扩展非 SQL 场景 |
| 1.5.0 | 2023-04 | dbt Mesh 与模型契约 | 多项目依赖与协作、列级 contract 声明 |
| 1.6.0 | 2023-07 | 语义层(Semantic Layer) | 声明式指标定义,统一下游 BI 消费口径 |
| 1.8.0 | 2024-05 | dbt Cloud CLI | 本地命令行与 dbt Cloud 无缝同步的项目体验 |
| 1.9.0 | 2024-10 | 项目可观测性改进 | 优化全局 CLI 参数与项目元数据浏览体验 |
dbt 的版本演进始终围绕“降低分析工程门槛”——从支持 Python 到提供语义层,都是在让更多角色(分析师、工程师、业务用户)用同一套工程化范式消费数据。选型建议:新项目直接采用 1.8+ 的适配器安装方式并启用模型契约;已有 1.0/1.3 老项目升级时,重点回归测试 ref 依赖解析与测试结果,这两块 API 虽有演进但兼容性良好。
AI 应用场景
ELT 管道构建与数仓分层建模
阶段:数据处理管道(ELT 的 T 环节)
解决的问题:传统方式下,数仓建模靠 DBA 手工维护大量 SQL 脚本,模型间依赖靠人肉记忆,全量重算耗时数小时。dbt 将转换逻辑拆分为 staging、marts 等多层模型,用 ref() 自动管理依赖并增量执行,数仓分层从“口头约定”变成“代码强制”。
具体案例:某电商数据团队将 200+ 条散落的 SQL 脚本重构为 80 个 dbt 模型,配合增量物化,每日核心报表的产出时间从凌晨 3 点提前到 1 点;新增一张报表的开发周期从平均 3 天缩短到 4 小时。
数据质量拦截与 CI 自动化
阶段:数据质量保障
解决的问题:上游业务库表结构变更(如新增一列、类型变更)会静默破坏下游模型。dbt 的测试机制联合 CI/CD,让数据质量检查像代码单测一样在合并前自动执行。
具体案例:某 Fintech 团队在 dbt 项目中为 150 个核心模型配置了 300+ 条数据测试(唯一性、非空、枚举值、关系完整性),并在 GitHub Actions 中针对 PR 变更跑 dbt test --select state:modified+,上线后 90% 的 schema 变更问题在合并前被拦截,生产事故率下降 70%。
数据字典与血缘治理
阶段:数据资产管理与治理
解决的问题:数据团队常被业务方追问“这个指标怎么算的、数据从哪来的”。dbt 自动生成的文档页和血缘图,让每个模型的字段描述、上游来源、下游去向一目了然。
具体案例:某零售集团在 40+ 模型上落地 dbt 文档规范,配合 dbt docs 自助查询入口,数据答疑类工单减少 60%,新分析师熟悉核心表结构的周期从 2 周压缩到 2 天。
常见误区
误区dbt 能建模型、跑测试、生成文档,那我把数据从业务库同步到数仓也交给 dbt 写个 Python 模型搞定。
正解dbt 的设计哲学是专注 T(transform),不负责抽取和加载。数据同步应该由 Fivetran、Airbyte 等 EL 工具完成,或在数仓中通过外部表/物化视图方案处理。把摄取逻辑写进 dbt 模型会破坏 DAG 的纯粹性,也绕开了 dbt 的依赖管理和测试体系。正确姿势是「EL 工具 + dbt」的管道组合。
为何常见:dbt 1.3 起支持 Python 模型,很多新手误以为可以用它做任意数据处理(包括 API 调用、文件读取),从而越界使用。
误区我只要把模型配置成 incremental,dbt 就会自动只处理新数据,跑得又快又省。
正解增量策略需要你亲手设计。它依靠 is_incremental() 宏来区分“首次全量”和“后续增量”两个执行分支,你必须在模型中用条件块过滤出新数据,并配置 unique_key 供更新/删除用。漏写条件会导致每次运行全量重算;写错过滤条件则会导致重复数据。使用增量物化前,先在 dbt build --full-refresh 上验证全量分支,再验证增量分支。
为何常见:materialized='incremental' 这行配置看起来“开启了增量”,但 dbt 并不知道你的业务数据如何增长——这需要人来表达“哪些是新数据”。
误区dbt Cloud 就是 dbt Core 的付费版,功能一样只是多了个网页界面。
正解两者共享项目结构和模型代码,但定位不同。dbt Core 是开源 CLI,负责编译和执行 SQL 模型;dbt Cloud 是托管平台,内置作业调度、CI/CD、环境变量管理、Run History 告警、语义层 API 等 Core 需要自行集成的能力。此外 dbt 1.8 的 Cloud CLI 让本地开发直接运行在 Cloud 基础设施上,进一步拉平了两者的开发体验。选型时按运维能力和预算决策,而非“功能差异”。
为何常见:dbt 的文档中 Core 与 Cloud 的配置经常混排,且 1.8 后两者 CLI 趋同,用户容易忽略自托管方案需要额外搭建调度和 CI 的事实。
误区dbt 在模型上可以加测试和文档,那我对敏感字段加个测试、写个说明,权限不就管好了嘛。
正解dbt 不做权限控制。所有 dbt 查询都使用 profiles.yml 中配置的数据库账号执行,模型能否被阅读取决于数仓自身的授权(如 Snowflake 的 row access policy、BigQuery 的列级 IAM)。dbt 的价值在于让权限策略以代码形式在数仓中可复现地创建(通过 hooks 调用 GRANT / ALTER 语句),而非替代数仓的安全层。
为何常见:dbt 的 UI 里能看到数据预览、能定义字段描述,容易让人误以为它也管访问控制;实际上预览走的是你配置的数据库连接,而流程上 dbt 团队通常建议权限策略交由 DBA 或 Terraform 管理。
误区seed 也是表,source 也是表,反正都能用 ref() 引用,选哪个无所谓。
正解两者用途完全不同。seed 加载项目中的 CSV 文件到数仓,适合存放映射表、时区表等静态小数据,归 Git 版本管、跟随项目走;source 声明数仓中已有、由上游系统同步而来的原始表(如业务库的 orders 表),并用 freshness 配置监控数据新鲜度。把业务大表塞进 seed 会导致每次 dbt seed 全量重建、CI 变慢;用 ref() 引用尚未声明的原始表则会丢失血缘与新鲜度监控。
为何常见:两者的引用语法相似(source('name','table') vs ref('model')),且都能出现在 SELECT 里,新手容易按“都是表”来理解,而忽略了生命周期差异。
面试题
Q1. 在 dbt 中,ref() 与 source() 的核心区别是什么?
- A.ref() 引用项目内模型,source() 引用外部原始表← 正确答案
- B.ref() 引用外部原始表,source() 引用项目内模型
- C.两者都是 Python 函数的别名,无区别
- D.source() 只支持云数仓,ref() 只支持本地库
答案:A。ref('model_name') 指向项目内(或已安装包中)的模型,dbt 解析该调用后自动建立模型间依赖;source('name', 'table') 声明对数据仓库中已有原始表的依赖,可附带数据新鲜度(freshness)监控。二者是 dbt 构建 DAG 的两类依赖来源,用途不同而非平台不同。
Q2. dbt 内置的开箱即用测试类型包括哪些?
- A.unique(唯一性校验)← 正确答案
- B.not_null(非空校验)← 正确答案
- C.accepted_values(取值枚举)← 正确答案
- D.mean_value(均值校验)
答案:ABC。dbt 内置四类通用测试:unique 断言列值唯一、not_null 断言非空、accepted_values 断言取值属于指定枚举、relationships 断言外键关系完整性。均值校验不属于内置测试,需要用 SQL 编写自定义测试(singular tests)或借助 dbt_expectations 等社区包实现。
Q3. 关于 dbt 的增量物化(incremental),下列说法正确的是?
- A.dbt 默认将普通模型物化为全量刷新的 table
- B.增量模型需配置 materialized='incremental' 并配合 is_incremental() 条件← 正确答案
- C.增量模型会自动感知上游插入并实时流式增量
- D.增量模型仅能在 Snowflake 与 BigQuery 上使用
答案:B。增量模型的生效依赖两件事:配置 materialized='incremental',以及在模型 SQL 中用 is_incremental() 宏包裹“只处理新增数据”的分支。dbt 不会自动判断哪些是新数据,也不会流式实时计算。增量物化在所有主流适配器上均可用,只是各数据平台的增量语法(merge、delete+insert)由适配器封装。
Q4. dbt 生成的血缘 DAG(Lineage)主要依据什么?
- A.数据仓库中已有的外键约束关系
- B.模型内 ref() 与 source() 调用组成的依赖图← 正确答案
- C.dbt_project.yml 中模型声明的先后顺序
- D.数据库查询日志与运行计划
答案:B。dbt 在编译阶段静态解析模型 SQL 中的 ref()、source() 等调用,构建模型间的依赖图并保证按拓扑序执行。它不读取数仓外键约束,也不依赖配置文件的声明顺序(后者只影响展示)。这也是 dbt 要求一切模型引用走 ref()/source() 的原因——绕过它们血缘就会断。
Q5. 下列哪些属于 dbt 内置的物化(materialization)方式?
- A.view(视图)← 正确答案
- B.table(表)← 正确答案
- C.incremental(增量表)← 正确答案
- D.stored_procedure(存储过程)
答案:ABC。dbt 内置 view、table、incremental、ephemeral 四种物化方式,其中 ephemeral 将模型编译为 CTE 内嵌进下游,不单独建表。存储过程不属于物化方式,如需执行存储过程应通过 hooks 或 run-operation 调用。物化选择需在查询性能、存储成本与数据新鲜度之间权衡。
Q6. 关于 dbt 的 hooks 与 operations,下列说法正确的是?
- A.hooks 只在运行前触发,operations 只在运行后触发
- B.hooks 在模型执行前后自动触发,operations 由命令手动执行← 正确答案
- C.hooks 只能用于模型完成后发送通知消息
- D.operations 可以被其他模型直接引用为依赖
答案:B。hooks(pre-hook / post-hook)是绑定在模型或项目上的 SQL 或宏,在执行 dbt run / build 时自动触发,常用于建表前后创建外部表、授权或清理临时数据。operations 通过 dbt run-operation 命令手动执行某个宏,二者触发机制不同。hook 是“自动化的”,operation 是“手动调用的”。
Q7. dbt snapshot(快照)的主要用途是什么?
- A.对数据仓库做低成本的全量物理备份
- B.实现渐变维度 SCD Type 2,追溯记录变化历史← 正确答案
- C.将多个模型合并为一个仓库视图
- D.为测试结果提供持久化的存储空间
答案:B。dbt snapshot 在源表每次数据变化时新增一行记录,通过 dbt_valid_from / dbt_valid_to 两个时间戳字段标记每行版本的有效期,实现 Type 2 渐变维度。它不是物理备份工具,也不负责合并模型或存储测试结果。快照常用于维度表历史追溯,如客户地址变更历史。
Q8. 关于 dbt Core 与 dbt Cloud,正确的是?
- A.dbt Cloud 是 dbt Core 的付费插件包
- B.dbt Core 是开源命令行工具,dbt Cloud 是托管 SaaS 平台← 正确答案
- C.dbt Cloud 仅支持 Snowflake 一种数据平台
- D.dbt Core 自带 Web 界面可以直接在浏览器编写模型
答案:B。dbt Core 是 Apache 2.0 协议的开源命令行工具,通过适配器支持 40+ 数据平台,可本地安装运行;dbt Cloud 是 dbt Labs 提供的托管服务,提供 Web IDE、作业调度、CI/CD、告警与语义层,且支持所有主流数仓。两者共用项目结构与 profiles 设计,Core 项目可无缝迁移到 Cloud。
Q9. 在 dbt 增量模型中,下列哪些做法必然导致数据重复或漏数?
- A.未用 is_incremental() 过滤而全量拼接新数据← 正确答案
- B.未配置 unique_key 导致去重缺失← 正确答案
- C.对增量模型执行 dbt build --full-refresh
- D.对增量模型运行 dbt test 校验
答案:AB。未使用 is_incremental() 时,每次运行会把全量数据追加到已有增量表,必然重复;不配置 unique_key,增量合并(merge 策略)失去去重和更新依据。--full-refresh 是主动重建全表的标准操作,不会造成重复或漏数;运行 dbt test 只读校验不改变数据。生产环境应确保增量分支 filter 正确、unique_key 稳定,并在 CI 中给增量模型留出全量重建的测试通道。
Q10. dbt 中 seed(种子)与 source(源表)的核心区别是?
- A.seed 加载 CSV 小表并纳入 ref 依赖,source 指向仓库原始表← 正确答案
- B.seed 只能加载 JSON 文件,source 只能加载 Parquet 文件
- C.seed 是只读的,source 则允许直接写入
- D.seed 默认物化为 view,source 默认物化为 table
答案:A。seed 通过 dbt seed 将项目内的 CSV 文件加载为数仓表,适合映射表等静态小数据,可被 ref() 引用并纳入版本控制;source 声明数据仓库中已存在的原始表(通常由上游 EL 工具同步),配合 freshness 监控数据新鲜度。两者适用场景不同,seed 不适合承载大表,source 也不是可写对象。
参考来源
- webpagedbt-core GitHub 仓库源码、Issue 讨论与贡献指南