一、什么是DBT

dbt (data build tool)是一款流行的开源数据转换工具,能够通过 SQL 实现数据转化,将命令转化为表或者视图,提升数据分析师的工作效率。dbt 主要功能在于转换数据库或数据仓库中的数据,在 E(Extract)、L(Load)、T(Transform) 的流程中,仅负责转换(transform)的过程。 通过 dbt插件,数据分析师能够通过 SQL 直接建立表单并匹配数据,而无需关注创建 table 或 view 的过程,并且可以直观地看到数据的流动;同时能够运用 dbt 编写 SQL、进行测试、以及包管理等功能。

二、DBT官方支持的数据源

Data Platform latest verified version
AlloyDB (same as dbt-postgres)
Azure Synapse 1.3.0
BigQuery 1.2.0
Databricks 1.3.0
Dremio 1.3.0
Postgres 1.2.0
Redshift 1.2.0
Snowflake 1.2.0
Spark 1.2.0
Starburst & Trino 1.2.0

三、开源社区支持的数据源

Athena Greenplum Oracle
Clickhouse Hive Rockset
IBM DB2 Impala SingleStore
Doris & SelectDB Infer SQLite
DuckDB iomete SQL Server & Azure SQL
Dremio Layer Teradata
Exasol Analytics Materialize TiDB
Firebolt MindsDB Vertica
AWS Glue MySQL
Databend Cloud fal - Python models

四、DBT关于建模的两个特点

1、DBT 能避免编写DDL语句

仅使用 查询SQL 语句或 Python dataframe编写业务逻辑,并返回所需的数据集,dbt 负责这些数据集的物化,从而构建可重用或模块化的数据模型,这些数据模型可以在后续工作中引用,而不是从每次分析的原始数据开始。这显著减少了数据查询的运行时间,dbt还能通过函数、工具包等构建和管理模型的ER图。

2、DBT 提供更可靠的分析

不再复制和粘贴 SQL,因为这可能会导致逻辑更改时出错。dbt可以构建可重用的数据模型,并将其提取到后续模型和分析中。更改一次模型,该更改将传播到其所有依赖项。发布特定数据模型的规范版本,封装所有复杂的业务逻辑。此模型之上的所有分析都将包含相同的业务逻辑,而无需重新实现它。使用类似git一样成熟的源代码管理流程,如分支、拉取请求和代码评审。在基础数据上快速轻松地编写数据质量测试。

五、DBT建模功能总结

特征 描述
将SQL查询语句转化为关系 数据模型通过编写固定格式的标准select语句来实现,DBT能够识别一个模型配置文件内SQL语句之间的血缘关系,在将SQL语句执行为表或视图的同时,提取表或视图之间的关系进行展示。
固化模型的执行顺序 通过DBT做复杂的数据转换,将分多个步骤,关于每个步骤的执行顺序,DBT 通过REF函数分阶段实现转换。
类似git的版本控制 DBT将模型编写、版本控制和每个模型和字段编写描述等,通过类似git的模式进行管控。
数据模型管理功能 DBT 附带了一个包管理器,使得模型代码的公共和私有存储库能够被有权限的其他人直接调用。
本地文件导入 如一些码表信息、CSV文件等,能够直接加载为数据库中的表。
数据快照 DBT 提供了为某个时间点的原始数据创建快照的机制。

六、DBT数据建模全流程实操

1、搭建DBT环境

DBT可在windows\mac\linux等系统独立部署运行,也可通过Docker部署,官方还提供DBT Cloud,本文档的演示环境为在windows系统下的linux环境。DBT的运行依赖Python环境,推荐Python3.9+版本,本文档的演示环境为Python3.9.7。

#1、安装必须的插件
###centos或者RedHat环境下:
sudo yum install redhat-rpm-config gcc libffi-devel python-devel openssl-devel
pip install --upgrade pip wheel setuptools ###ubutun或者deb、deepin环境下
sudo apt-get install redhat-rpm-config gcc libffi-devel python-devel openssl-devel
pip install --upgrade pip wheel setuptools #2、安装需要的数据源插件(按需选择,如本文档演示环境为Kingbase8,选择postgres即可)
pip install \
dbt-core \
dbt-postgres \
dbt-redshift \
dbt-snowflake \
dbt-bigquery #3、安装完毕后,查看版本号
dbt --version

依次运行完上述命令后,正常情况下会输出以下内容。,证明安装完毕!

2、初始化DBT构建项目

dbt init dbt_project

运行完成后,会在当前用户家目录下生成.dbt目录,目录结构如下,一般访问~/.dbt路径即可到达该目录,目录下生成了以下子文件夹及dbt_project.yml即可证明初始化成功,建议将该目录迁移到某一个固定空间,如本文的D:/test/dbt_project

3、修改数据库连接信息

修改profiles.yml文件,添加数据库连接的URL、USERNAME、PASSWORD等信息,保存后运行命令:

dbt debug

当输出如下内容,即证明DBT成功连接到配置好的数据库(本文连接的是测试环境KingbBase)

4、启动DBT

dbt run

输出以下信息,即可证明启动成功!

5、为项目生成文档

dbt docs generate

DBT初始化后自动加载一个dbt.mysql_first_model、dbt.my_second_dbt_model的数据模型,除此之外的模型都是自定义模型。具体输出如下日志即可证明成功生成文档。

6、打开Web页面查看模型

dbt docs serve

启动后自动记录访问日志,输出如下:



web页面本地访问地址:http://127.0.0.1:8080

本次台式机Windows10环境已部署一套,访问地址为:http://10.63.205.53:8080

7、自定义模型开发

本次数据建模从数据导入、数据计算、模型生成三个步骤进行,模拟真实建模过程。

7.1、通过DBT导入数据到数据库

创建两个个csv文件fund_name_em.csv,放入项目下的seeds目录,然后seeds目录下再创建fund_data.yml,一次建模所需的文件准备就已经完成,可以看到,仅需一个数据文件,一个yml格式的配置文件。

fund_name_em.csv

fund_portfolio_hold_em.csv



其中fund_data.yml文件的内容如下,解读下关键信息,name代表需要通过DBT导入数据库的模型名称(就是表名称),config代表自定义配置项(DBT会自动推断字段类型,如需指定可通过此方式完成):

version: 2
seeds:
- name: fund_name_em
config:
column_types:
fund_code: varchar(16) - name: fund_portfolio_hold_em
config:
column_types:
fund_code: varchar(16)

以上准备工作完成后,运行命令实现数据导入:

dbt seed

正确执行完成输出的日志为:



查看数据库可以发现已经实现了数据自动建表

tips:多次执行dbt seed不会产生多份数据, 导入前会先truncate清空老的数据。如果表结构有变化, 则需要删除表在执行seed命令。

7.2、创建自定义的模型

在DBT安装根目录下的models文件夹,新建一个子目录,目录名即为项目名,如本次命名为fund_status, 然后在该目录下新增一个sql文件fund_portfolio_stats.sql。注意这个sql文件,就是本次模型构建的关键。

-- 统计3只基金等权重买入后的重仓股占比
with fund_stock_map AS (
SELECT fund_code, stock_code, stock_name, cast(percent / 3 AS DECIMAL(18,2)) AS percent
from {{ ref('fund_portfolio_hold_em') }}
-- WHERE fund_code IN ('001716', '002446', '005094')
-- AND season = '2022年2季度股票投资明细'
-- AND percent > 0
),
fund_info AS (
SELECT fund_name, cast(fund_code as int4) as fund_code
FROM {{ ref('fund_name_em') }}
-- WHERE fund_code IN ('001716', '002446', '005094')
),
stock_sum AS (
SELECT stock_code, stock_name,
cast(SUM(percent) AS DECIMAL(18,2)) pct
from fund_stock_map
GROUP BY stock_code, stock_name
HAVING SUM(percent) > 0.5
)
SELECT stock_sum.stock_code, stock_sum.stock_name, stock_sum.pct AS total_pct,
fund_info.fund_code, fund_info.fund_name, fund_stock_map.percent AS indiv_pct
FROM stock_sum,fund_stock_map ,fund_info
--ON fund_stock_map.stock_code = stock_sum.stock_code
--JOIN fund_info
WHERE fund_info.fund_code = fund_stock_map.fund_code and fund_stock_map.stock_code = stock_sum.stock_code
order by pct desc

tips:这里我们只用到了dbt最基本的ref宏, 可以用宏名称替代具体的表名. 因为前面我们已经通过seed命令导入了2个表, 所以这两个表直接可以通过名字来进行引用.dbt的宏极为强大,具体可关注官网

重点来了!sql文件保存完毕后, 通过后台命令就可以生成这个sql文件代表的这个模型!!!

dbt run -s fund_portfolio_stats

注意如果语法不符合所选数据源的规范,或者字段类型不匹配等,如果针对自己编写的sql文件不确定对错,可在相关数据源进行执行验证,比如本次字段不匹配造成的错误如下:



sql文件被DBT正确执行后,输入的日志为:



这种自定义的模型并不会将表实际落地到数据库,而是保存为一个视图,这一点需要注意。在执行完以上命令后,再次在命令行依次执行dbt docs generate和dbt docs serve, 会在浏览器里打开文档页面。回到Dbeaver查看效果如下:



在Web界面打开该数据模型的血缘关系图,可以明显看到最终模型所用到的表,效果如下:

七、DBT使用心得

7.1 缺点

7.1.1 一定的使用门槛

DBT作为一款数据建模工具,其用户相对偏向数据工程师、数据分析师等有一定技术背景的人员,如一次自定义模型的建设,既要通过命令行操作(可交给运维人员),也要完成优秀且没有错误的SQL脚本书写。

7.1.2 无法一套SQL随处运行

SQL脚本需要根据DBT连接的数据源进行适配,如连接postgres、hive、Oracle等数据源时,所需的SQL文件需要改造为符合当前数据源的语法,无法做到一个SQL,随处建模。

7.1.3 无法一套SQL随处运行

国内技术文档偏少,国内常用数据源支持不足。

7.1.4 无认证流程

当DBT的web服务启动后,所有人能够访问,没有权限管控或者账号密码体系。

7.2 优点

7.2.1 统一数据建模规范

维护统一的基础数据源,数据建模做了扎口,当所有人通过DBT做数据模型建设时,数据模型不仅可复用,也包含数据血缘关系展示,并且当基础数据源有变更时。已有数据模型将自动更新,规范数据模型建设,提高了数据模型的复用性、稳定性,有效降低重复建设等成本问题。

7.2.1 数据源支持丰富

除了业界常用的数仓组件外,也支持如Oracle、Postgres等关系型数据库以及一些时序数据库,能做到利用DBT统一连接公司数据源供下游数据建模团队使用。

7.2.3 自动物化查询

实操发现DBT能够避免人工建表,无论是数据导入,还是数据模型,都能自动实现建表或建视图,避免了人工出现的失误和误删表等不可控操作,从一定程度上保证了数据质量,统一了源数据的口径等。

7.2.4 数据模型版本管理功能

官网提到了数据模型历史版本的管理功能,类似git,生产环境下,比较方便数据模型变更、回滚、快照保存等,本次测试也可以发现,新建模型的目录下会生成.gitkeep文件

数据转换工具DBT介绍及实操的更多相关文章

  1. 性能测试工具 jmeter 分布式压力测试实操

    性能测试工具 jmeter 分布式压力测试实操 本文在Non-GUI Mode下进行,准备好三台有jdk环境,linux操作系统,同一局域网测试机器,运行两台slave,一台master机器,进行分布 ...

  2. kettle安装部署基本操作及实操文档

    一.kettle是什么? Kettle,简称ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程),是一款国外开源的ETL工具,纯Java编写,可以在Window. ...

  3. 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了

    引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中?         本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中 ...

  4. SBT实操指南

    参考资料:1.英文官方文档2.中文官方文档,内容翻译的不全 SBT是类似maven和gradle的自动构建和包依赖管理工具,SBT是Scala技术体系下的包管理工具,都是Lightbend公司开发的, ...

  5. HDFS集群PB级数据迁移方案-DistCp生产环境实操篇

    HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...

  6. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...

  7. Linux+Nginx+Supervisor部署ASP.NET Core实操手册

    一.课程介绍 在上一节课程<ASP.NET Core托管和部署Linux实操演练手册>中我们学过net core的部署方式多样性和灵活性.我们通过远程工具输入dotnet 程序集名称.dl ...

  8. Istio的流量管理(实操一)(istio 系列三)

    Istio的流量管理(实操一)(istio 系列三) 使用官方的Bookinfo应用进行测试.涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求 ...

  9. Istio的流量管理(实操二)(istio 系列四)

    Istio的流量管理(实操二)(istio 系列四) 涵盖官方文档Traffic Management章节中的inrgess部分. 目录 Istio的流量管理(实操二)(istio 系列四) Ingr ...

  10. 72 个网络应用安全实操要点,全方位保护 Web 应用的安全

    原文地址:Web Application Security Checklist 原文作者:Teo Selenius(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...

随机推荐

  1. Python:多进程并行编程与进程池

    Python的并行编程可以采用multiprocessing或mpi4py模块来完成. multiprocessing是Python标准库中的模块,实现了共享内存机制,也就是说,可以让运行在不同处理器 ...

  2. npm设置

    1.默认安装完node.js后会自己安装npm,通过npm下载全局模块默认安装到C:\Users\wangyc\AppData\Roaming目录下,主要有两个文件夹:npm.npm-cache 2. ...

  3. 静态文件配置 django连接MySQL django模型层初识 ORM基本语句

    目录 静态文件配置 1. 问题描述 2. 静态文件 3. 资源访问 form表单属性补充 action method 请求方法 get请求 post请求 views层 request对象 reques ...

  4. QT中常用控键

    1.TableWidget类 1.1. 表格属性设置 1.1.1设置行列属性 //设置行列均分 tableWidget->horizontalHeader()->setStretchLas ...

  5. 一个sql和C#代码结合的分组求和的查询

    业务描述:  业务主表(tab_main 主键 id), 供应商名称(supplier), 金额(amount 需要统计求和),还有分类( 有单独的表categoryid),集中采购标记字段(tend ...

  6. ctfshow——萌新web3

    题目如下: 源码分析: 通过id可以传入一个参数,对id的值进行了过滤,这里是正则匹配过滤,内容分析:or,-,\,*,<,>,!,x,hex,+.最外面的i是同时匹配过滤内容的大小写.在 ...

  7. Pytorch基础-tensor数据结构

    torch.Tensor Tensor 数据类型 Tensor 的属性 view 和 reshape 的区别 Tensor 与 ndarray 创建 Tensor 传入维度的方法 参考资料 torch ...

  8. 03-逻辑综合工具 - Design Compiler

    逻辑综合工具DC IC设计流程,市场-->制定spec-->RTL(同时进行sim,通过alint检查RTL有没有错误)-->systhesis(逻辑综合)-->PR(STA) ...

  9. Spring Cloud服务发现组件Eureka

    简介 Netflix Eureka是微服务系统中最常用的服务发现组件之一,非常简单易用.当客户端注册到Eureka后,客户端可以知道彼此的hostname和端口等,这样就可以建立连接,不需要配置. E ...

  10. 学习ASP.NET Core Blazor编程系列二十二——登录(1)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...