总结之数据清洗框架DBT

DBT(Data Build Tool)

核心定位:ELT 中的 "T"

官网:https://docs.getdbt.com/docs/introduction

我们使用dbt core 开源免费

dbt Cloud vs dbt Core

特性 dbt Core (开源) dbt Cloud (企业版)
调度 需要外部工具 (Airflow, etc.) 内置调度器
CI/CD 需要自行设置 内置 PR 环境、自动化测试
界面 命令行 Web IDE、监控面板
协作 有限 团队协作、权限管理
成本 免费 按用量付费

目标:

1.好的清洗流程开发体验

2.支持全量、增量清洗

3.支持多维度清洗-城市维度、项目维度

4.清洗支持多任务并行

5.清洗可以做到近实时清洗

6.支持维护节点依赖关系

7.现有工作流集成

dbt 核心定位与特性

dbt 是专注于数据转换阶段的开源工具,采用声明式建模方式。用户只需定义数据模型逻辑,dbt 自动生成并执行 SQL。关键特性包括:

关键特性 说明
"做什么"而非"怎么做" 声明式建模:定义 users.yml 中的模型逻辑,dbt 自动推导依赖和执行顺序。
只有 SQL + Jinja 模板 不引入新语言,降低学习成本;Jinja 提供变量、循环、条件等模板能力,提升 SQL 的动态性和复用性。
专为现代数据仓库设计 直接运行在 Snowflake、BigQuery、Redshift、Databricks 等数仓之上,利用其强大计算能力做转换(ELT 模式)。
内置 DAG 与依赖管理 使用 ref() 函数引用模型,dbt 自动解析依赖关系图(DAG),确保按正确顺序执行。
高度模块化与可复用 通过 macros(宏)封装通用逻辑(如日期处理、指标计算),实现跨项目代码复用。
自动生成文档网站 解析模型、字段注释、血缘关系,一键生成交互式文档站点,便于团队协作和数据治理。
内置数据质量测试 支持唯一性、非空、外键、自定义 SQL 断言等测试,可在 CI/CD 或调度流程中自动运行。
原生支持 Git 与 CI/CD 所有代码即配置(YAML、SQL、.yml),天然适合版本控制,易于集成 GitHub Actions、GitLab CI 等自动化流程。

dbt 的工作流程(典型 ELT 流程中的位置)

与"阿里云清洗数据平台"类产品的对比

维度 dbt 阿里云 DataWorks 等平台
架构模式 ELT(转换在数仓内完成) ETL(外部计算引擎如 MaxCompute)
技术栈 SQL + Jinja + YAML(代码优先) 图形化拖拽 + SQL/PyODPS(平台化)
部署方式 开源/私有化/SaaS(dbt Cloud) 云厂商封闭平台,绑定阿里云生态
灵活性 高(完全掌控 SQL 和逻辑) 中(受限于平台组件和调度机制)
版本控制 原生 Git 集成,CI/CD 成熟 支持较弱,需配合外部系统
学习曲线 需熟悉 SQL、DAG、Jinja 图形化易上手,适合初级开发者
适用团队 工程化、DevOps 化数据团队 企业级多角色协作(开发/运维/管理员)
成本模型 开源免费或按 seat 收费 按资源使用量 + 功能模块计费

●dbt 更像"数据工程师的代码框架",强调代码化、版本化、自动化,适合追求敏捷、可复用、高质量数据产品的团队。

●DataWorks 更像"企业级数据中台操作系统",强调可视化、流程管控、权限治理,适合需要统一管理、跨部门协作的大型组织。

●dbt也是重点在Snowflake / BigQuery / Redshift 等现代数仓数据清洗

dbt工作原理

开发体验优势
  • 熟悉的 SQL + Jinja 组合,支持动态逻辑(循环、条件等)
sql 复制代码
{% for country in ['CN', 'US', 'UK'] %}
SELECT * FROM raw_orders WHERE country = '{{ country }}'
{% if not loop.last %} UNION ALL {% endif %}
{% endfor %}
  • 声明式依赖管理(ref()source()函数)
sql 复制代码
-- model: fct_orders.sql
SELECT 
    o.order_id,
    u.user_name
FROM {{ ref('stg_orders') }} o
JOIN {{ ref('stg_users') }} u ON o.user_id = u.user_id

这种"模块化"思维让数据建模更像软件开发。

  • 本地快速验证(dbt run/test/compile

    可通过 dbt run, dbt test, dbt compile 在本地快速验证逻辑。

    ○dbt compile 可查看 Jinja 渲染后的最终 SQL,便于调试。

    ○结合数据库客户端(如 DBeaver、VS Code 插件),可直接运行片段进行测试。

  • 自动生成包含血缘关系的文档网站

  • 有dbt开发插件

全量与增量清洗实现

全量清洗流程

  1. 删除备份表

  2. 重命名目标表为备份表

  3. 通过查询创建新表

    步骤一:删除上次运行的备份表
    drop table if exists pom_server.pom_project__dbt_backup cascade
    步骤二:把目标表表名更改为备份表表名
    rename table pom_server.pom_project to pom_server.pom_project__dbt_backup
    步骤三:通过查询的数据创建表
    create table
    pom_server.`pom_project as
    ( 查询语句)

增量清洗流程

  1. 创建临时表存储查询结果

  2. 检查表结构一致性

  3. 根据临时表数据删除目标表记录

  4. 将临时表数据插入目标表

sql 复制代码
步骤一:执行SQL文件中的创建临时表
  create temporary table
    `pom_server`.`pom_project__dbt_tmp`  as
    ( 查询SQL)
步骤二:检查表结构
show columns from pom_server.pom_project__dbt_tmp
show columns from pom_server.pom_project
步骤三:根据临时表唯一值删除目标表数据
         delete
    from `pom_server`.`pom_project`
    where (id) in (
        select id
        from `pom_server`.`pom_project__dbt_tmp`
    )
步骤四:临时表数据插入到目标表中
  insert into `pom_server`.`pom_project` (`id`, `city`, `city_type`, `region_name`, `proj_name`, `proj_state`, `proj_adress`, `avg_price`, `s_room_use`, `proj_build_area_summary`, `s_developer`, `latitude`, `longitude`, `sector`, `total_price`, `platform_type_count`, `is_enterprise_verified`, `created_at`, `updated_at`, `launch_time`, `delivery_time`, `project_features`, `property_category`, `sales_status`, `pre_sale_license`, `top_developer_name`, `main_area`, `data_crawled_date`, `master_id`, `is_deleted`, `dt_timestamp`, `dt_timestamp_unique`)
    (
       select `id`, `city`, `city_type`, `region_name`, `proj_name`, `proj_state`, `proj_adress`, `avg_price`, `s_room_use`, `proj_build_area_summary`, `s_developer`, `latitude`, `longitude`, `sector`, `total_price`, `platform_type_count`, `is_enterprise_verified`, `created_at`, `updated_at`, `launch_time`, `delivery_time`, `project_features`, `property_category`, `sales_status`, `pre_sale_license`, `top_developer_name`, `main_area`, `data_crawled_date`, `master_id`, `is_deleted`, `dt_timestamp`, `dt_timestamp_unique`
       from `pom_server`.`pom_project__dbt_tmp`
    )

备注:针对步骤三,删除语句通过id大数据量删除执行缓慢,可以使用前置钩子进行城市条件删除

如果是Starrock可以直接插入不需要删除,根据不同数据库操作不同。

多维度清洗支持

通过变量控制清洗维度:

bash 复制代码
# 全量城市模式
dbt run --models pom_project --vars "{'city':'北京'}"

# 增量项目模式  
dbt run --models pom_project --vars "{'project_id':'123','is_incremental':true}"
关键适配能力
  • 并行清洗:通过 DAG 自动并行执行独立任务
  • 近实时清洗:结合增量模式与高频调度
  • 依赖管理:自动维护节点依赖关系
  • 工作流集成:支持 CLI 和 API 调用,可与现有调度系统对接
并行冲突解决机制

A. 数据库连接隔离

●✅ 独立连接:每个dbt进程使用独立的数据库连接

●✅ 会话隔离:临时表只在当前连接中可见

●✅ 自动清理:连接关闭时临时表自动删除

B. 事务隔离

●✅ 独立事务:每个模型在独立事务中执行

●✅ 原子操作:要么全部成功,要么全部回滚

●✅ 数据一致性:确保数据完整性

C. 临时表作用域

●✅ 会话级别:临时表只在当前会话中可见

●✅ 名称唯一:__dbt_tmp 后缀确保唯一性

●✅ 自动管理:dbt自动创建和清

大多数数仓不支持会话域临时表,通过调整临时表名称随机后缀实现并行。

实施建议
  • 对已有数仓且追求工程化的团队,dbt 可显著提升开发效率
  • 需评估现有技术栈与 dbt 的兼容性(特别是数据库支持)
  • 增量清洗性能需针对大数据量场景优化(如分区删除策略)
相关推荐
老徐电商数据笔记2 小时前
技术复盘第四篇:Kimball维度建模在电商场景的实战应用
大数据·数据仓库·技术面试
科技小金龙3 小时前
小程序/APP接入分账系统:4大核心注意事项,避开合规与技术坑
大数据·人工智能·小程序
科学最TOP3 小时前
xLSTM-Mixer:基于记忆混合的多变量时间序列预测
大数据·人工智能·算法·机器学习·时间序列
LF3_3 小时前
Centos7,单机搭建Hadoop3.3.6伪分布式集群
大数据·hadoop·伪分布式
x新观点3 小时前
2025年IDC服务商市场观察:博大数据在第三方数据中心排名中表现稳健
大数据·人工智能·云计算
YangYang9YangYan3 小时前
2026年中专学历考会计的证书选择路径
大数据·人工智能·学习
x新观点3 小时前
2025年IDC服务商市场深度解析:博大数据荣登第三方数据中心排名前列
大数据·人工智能·云计算
张人玉3 小时前
LiveCharts WPF MVVM 图表开发笔记
大数据·分布式·wpf·livecharts
建投数据4 小时前
建投数据再度获评国家级“高新技术企业”
大数据·人工智能