dbt
是 dbt labs 公司在2016年推出的一款基于 Python 的开源数据加工工具。从2019年开始,dbt
的用户数量增涨十分迅速。dbt labs 凭借此工具,在2022年估值达到了 42 亿美金。
dbt
的价值
dbt
是面向分析工程师提供服务。【分析工程师】是dbt
新定义的岗位,是基于 DataOps 思想,综合了数据工程师和数据分析师两者。即分析师也应该会代码开发(实际上,现在很多的数据分析师就是在做sql
开发的活)。- 数据应该先被加载到数据仓库,再做转换
传统的ETL
工作流,T
转换的工作在中间,由数据工程师完成。要求数据工程师对业务和数据加工逻辑要非常了解才行。但实际工作要达到这点很难,目前国际上的数仓项目,普遍都只能达到20%的预计目标,近几年数据湖才越来越流行。新的思想是EL-T
,即T
转换放在最后,由分析师来完成。在此思想下,Fivetran,Airbytes之类的工具才越来载流行。 - 分析师缺少有效的工具管理他们的工作
dbt
就是这样的工具,而且在此领域,dbt
是唯一的产品,没有竞争对手。2019年,Fivetran
宣布放弃集成SQL
,开始集成dbt
,2021年彻底抛弃SQL
,由此可以看出dbt
的魅力。
dbt
的特性
- 开源免费:
dbt
有两个产品,dbt-core
是开源免费的,需要安装才可以使用。dbt-cloud
是付费的云服务。 - 所有操作都会编译成
SQL
语句,下推到数据库完成,自身不存储数据。自从数据安全法开始推出后,所有 etl 工具都会面临安全要求。dbt
的此特性成了优势。 - 提供版本管理、配置继承、包、宏等功能点,可以很好地支持团队数据开发。这是
DataOps
的核心思想,即Data as Code
。 - 提供
test
数据质量测试功能,也是dbt
的核心思想。由于数据在源源不断的产生,数据交付是一个长期的过程。在以往的数据交付,缺少对数据的测试,只能出了问题再溯源追查,对用户和数据开发者,都是超级痛苦的事情。 - 自动建表
dbt
可以按照写好的模型,自动编译出建表语句。有些大型项目,成百上千的表,建表真是建得想砸电脑了。 - 提供文档功能
这个真的很赞,以往的项目,建模->建表->ETL开发->测试->交付文档,一个小变更就要改一堆东西。别和我说PowerDesigner
可以自动生成,不准的,特别是在多人协作的时候,合并pdm
文件真是个苦力活。dbt
的维护,真得轻松。 - YAML配置和命令行操作
搞过ETL
开发的数据工程师,没几个喜欢拖拉拽的图形化操作。还是命令行操作更方便。yaml
文件配置也很好搞,很多机械化的操作,都可以用代码批量做了。
dbt
的缺点
- 支持的数据库有限
官方适配器支持的数据库很少,好在还有社区适配器,不然连clickhouse
,vertica
之类的都不支持。惨的是,国内的云平台MaxComputer
等不在支持范围内。dbt
官方网档:Supported data platforms - 不能跨数据库读写
读取和写入的数据库,只能是同一个。这个估计官方是不会改了,好在schema
可以通过加后缀的方式,实现跨schema
读写,不然得疯。 - 版本更新慢
Postgres
的版本都到15了,dbt-postgres
还只能支持14,唉。免费的,只能将就了。 - 对
Python
的支持
一言难尽了,虽然dbt
是基于Python
开发的,但只在BigQuery
等个别平台中,才可以使用Python
模型。现在很多ETL
工具,如Kettle
Talend
Alteryx
等,都支持Python
R
Java
JavaScript
扩展。dbt
的这方面,实在没法尬吹了,只能寄望未来了。
综合以上,在实际部署dbt
的时候,还是需要多测试一下,确保版本、适合器、功能都满足需要才成。另外,在 dbt
官网 没有找到关于集群的说明,虽然 dbt
的工作模式是下推给数据库执行,但海量数据的处理,我觉得还是存疑的。
但只是分析师小规模使用的话,dbt
还是蛮爽的。
安装 dbt
dbt
有两个产品,dbt-cloud
是付费的云端产品,不用安装。通常说的 dbt
,是指 dbt-core
,开源免费的。可以使用 pip
安装,也可以使用 docker
镜像。这里,咱们只说 pip
安装。
从不知道哪个版本开始,dbt
拆分成了以下三个部分,需要分别安装:
dbt-core
,dbt
的核心文件。dbt-<adapter>
,目标数据库的适配器,用哪个就装哪个。dbt-utils
,扩展包,提供了很多非常有用的扩展功能,比如查询字段名等等。
安装过程
以 Windows
环境为例:
- 安装
Python
环境,dbt
是基于Python
,安装方法网上有很多,这里略过了。注意一般不要选择最新版本的Python
,dbt
跟不上的。具体可以上 pypi 搜索一下,看dbt
支持的Python
版本。 - 安装
dbt-core
,执行pip install dbt-core
就好。 - 安装
adpater
,以postgres
为例,执行pip install dbt-postgres
即可,其他适配器,可以在 Supported data platforms 上搜索一下。 - 初始化项目,执行
dbt init project-name
,project_name
是自己的项目名称,按需要填。初始化过程中,需要选择使用的适配器,按照自己的情况选就好。 - 安装
dbt-utils
- 先在项目录下,创建
packages.yml
文件,内容如下:packages: - package: dbt-labs/dbt_utils version: 1.1.0
- 在项目目录下,执行
dbt deps
完成安装。
- 先在项目录下,创建
- 在
C:\Users\<UserName>\.dbt/
目录下,找到profiles.yml
,在项目名称项下填写数据库连接信息。其中,dev
下的是开发数据库,prod
是生产环境的数据库,使用target
控制用哪个配置。