可能到这里,大家觉得安装完适配器以及dbt core 就已经够了,然后我们在终端直接通过命令链接数据库进行操作,其实不是的。我们需要初始化一个项目,而且我们还需要在项目中编写数据模型语句,以及一些基本的配置代码。
初始化一个 dbt 项目有两种方式,第一种是直接通过命令:
## 你可以在你的项目目录下运行
dbt init
之后 dbt 会帮你创建一个模版项目,假设你出现了 dbt 命令不存在的报错,那么就是你的 dbt core 包没安装好,你应该重新走上文的命令,以及通过 pip show dbt-core
来检查你的 core 版本信息。
除了命令,其实我更推荐使用官网的模版项目,因为 dbt 命令除了数据做转化,还包含数据写入数据库的命令,而 init 创建的模版只是最基础的模版,不包含模拟数据,也不包含模拟的数据模型,一切从零开始还是会存在部分难度。
大家可以直接跳转 jaffle_shop,然后 git clone
下载本地,之前由于我们已经安装了 core 和对应的适配器,所以我们直接拿这个项目练手就好了。
需要注意的是,我第一次使用 dbt init
初始化项目,这个命令很奇怪会在电脑根路径创建一个profiles.yml
配置,而项目本身就是依赖这个配置来与数据库建立联系。
其实大家应该都想得到,这种核心配置肯定得跟着项目走,全局即便有也应该会被项目内的配置所覆盖,结果我在项目根目录专门创建profiles.yml
后执行命令每次还是走根路径的配置,此问题可能跟我 dbt 版本有关,暂时解释不了。
我查阅了官网的说明,官网也确定会优先走项目根目录的配置,电脑根目录配置只是起到默认兜底的作用。但假设大家使用 jaffle_shop 项目,因为缺少 init 过程,没有根目录创建配置的行为,起码后续我的命令确实走了项目内的配置。
万事俱备,现在我们需要链接数据库,接下来才能做数据转换的工作,这里我们以 bigquery 为例。
首先 bigquery 是 Google 的数据平台,它支持四种连接方式,具体可参考:bigquery setup
这里我以 Service Account File
的方式来链接。其次,由于 Google 数据库不支持本地连接,所以我们需要把 clone 的项目整个上传服务器,通过远端来联调数据库,前端同学如果不清楚,可以问下服务端同学日常开发怎么做的就好了。
我们需要在之前 clone 的 jaffle_shop 项目下创建 profiles.yml
文件,之后粘贴如下代码到文件即可:
jaffle_shop:
target: dev
outputs:
dev:
type: bigquery
method: service-account
project: demo-data-analytics
dataset: dev_data_statistics
threads: 4 # Must be a value of 1 or greater
keyfile: data-analytics-bef7505.json
首先 jaffle_shop
这个字段需要跟我们项目根目录下 dbt_project.yml
中的 profile 属性字段相同,你可以取任何名字,但两边得保持一致。
target:dbt 项目本身也有分支和环境的区别,现在我们就是学习和测试,所以这里环境可以定义为 dev 即可。
type:你所使用适配器所对应的数据库名称,因为我们使用的是 bigquery,所以这里填 bigquery 即可。
method:固定配置,不用改。
project:项目名,注意是你的项目名,当然也可能叫数据容器名,就是最外层的容器名。
dataset:数据集名称,一般一个数据集下包含多张数据表,所以这个关系就是数据库---数据集--数据表的关系。但需要注意的是,一般数据库有N个数据集,我们操作数据也不可能只操作一个数据集,所以这里的 dataset 只是作为默认值,如果大家有数据库所有权限,还是能查询所有数据集,不过它会影响 dbt seed 数据库新表的创建位置,一般我们 dataset 提供哪,seed 命令创建的新表就在哪。总而言之,不影响查询数据转换,但是影响 seed 和我们 model 新表、视图创建的位置。
threads:用于指定运行 dbt 任务时的并发线程数。使用多个线程,可以加快 dbt 流水线的执行速度,这里我们也默认 4 即可。
keyfile:链接 Google 数据库也需要授权,简单理解就是一份秘钥,因为我的秘钥也直接放在了项目根路径,所以我这里直接引即可。
配置完成后,我们执行 dbt debug
可以检查项目与数据库的链接情况,比如:
那么到这里,我们成功让 dbt 项目链接到了远端数据库,要做数据分析或者建模,我们肯定得提前往数据库写入部分数据然后再基于数据做分析,使用上文提到的 jaffle_shop 模版项目的好处就是,项目直接为我们准备好了数据文件和模型文件,现在让我们执行如下命令:
## 将项目中 scv 数据文件写入连接的数据库
dbt seed
## 运行整个 dbt 项目,开始数据建模
dbt run
在执行完成后,当我们来到数据库中的 dev_data_statistics 数据集,在此数据集下即可看到 jaffle_shop 中所定义的模型文件。有一个小技巧,dbt 在数据库中创建的所有模型名称都默认是我们的 sql 文件名,这非常方便我们对应查找表或者视图。
那么道理,我们基本走完了一个 dbt 流程,成功配置且运行了属于我们第一批数据模型。
顺带,我整理了部分 dbt 命令注解:
build
:按照指定的顺序运行所有的数据加载、数据模型、数据快照和数据测试。这个命令会编译 SQL 并执行相应的操作,构建数据仓库。
clean
:删除指定的文件夹,通常用于清理生成的文件或目录。clone
:创建一个节点的副本,可以在项目中复制和重用节点。这个命令可以帮助你快速创建类似的数据模型。compile
:将 dbt 项目中的代码转换为可执行的 SQL 语句,这个命令可以帮助你检查和验证你的代码是否正确。debug
:显示当前 dbt 环境和配置的信息(上面用过了),这个命令可以帮助你了解当前的 dbt 设置和环境变量。deps
:更新项目中使用的依赖项,以获取最新版本的依赖库(dbt 也有三方包,后续文章讲)。docs
:生成或提供你的项目的文档网站,这个命令可以帮助你生成和查看项目的文档,以便其他人了解你的数据模型和操作。init
:初始化一个新的 dbt 项目,这个命令会创建一个新的 dbt 项目,并生成必要的文件和目录结构,以便你开始构建数据仓库。list
:列出项目中的资源,如数据模型、表、视图等。这个命令可以帮助你查看项目中的所有资源。parse
:解析项目并提供关于性能的信息,这个命令可以帮助你了解项目的结构和性能,以便进行优化。retry
:重新运行上次运行失败的节点,这个命令可以帮助你重新运行失败的数据模型或操作,以解决错误。run
:编译 SQL 并运行指定的数据模型或操作。这个命令用于执行 dbt 项目中的数据模型和操作,以构建数据仓库。
seed
的主要目的是加载原始、静态的数据,这些数据通常不需要经常变动,例如国家列表、产品类别等。seed
会负责将这些静态数据加载到数据库中,为后续的分析和转换提供基础数据。run
的主要目的是运行数据模型,通过执行 SQL 查询和转换逻辑,生成新的表、视图或者其他的数据结构。这些模型可能依赖于 seed
导入的数据,也可能依赖于其他模型生成的数据。dbt run --models model_name
,或者dbt run --models model1,model2
。dbt run --target dev 或者 prod
run-operation
:运行指定的宏(macro),并传递任何提供的参数。这个命令可以帮助你运行自定义的宏,以实现特定的数据处理逻辑。seed
:从 CSV 文件中加载数据到数据仓库中。这个命令用于将数据加载到你的数据仓库中,以供后续的数据模型使用。show
:为指定的数据模型或操作生成可执行的 SQL。这个命令可以帮助你查看指定数据模型或操作的 SQL 代码。snapshot
:执行项目中定义的数据快照操作。这个命令用于执行 dbt 项目中定义的数据快照操作,以捕捉数据的历史状态。source
:管理项目的数据源。这个命令可以帮助你添加、配置和管理项目中的数据源,以便从不同的数据源中提取数据。test
:这个命令用于在已部署的数据模型中运行数据测试,以确保数据的准确性和一致性,基本作用:
举个 test 的例子:
models:
- name: my_model
tests:
- my_test:
severity: error
description: "Check if column X contains null values"
check: "select count(*) from {{ ref('my_model') }} where X is null"
expect: "select 0"
在上面的示例中,my_test
是一个测试用例的名称,my_model
是模型的名称。check
查询语句中使用了 {{ ref('my_model') }}
来引用模型,然后检查模型中的列 X
是否包含空值。
dbt run
命令默认创建的是视图(views),但是你可以通过在模型文件中设置{{ config(materialized='table') }}
来指定dbt run
生成表(tables)而不是视图,或者在 dbt_ project 配置中对文件夹进行定义。
举个例子,我们在 dbt 模型文件顶部添加以下代码:
{{ config(materialized='table', sort='timestamp', dist='user_id') }}
-- Your SQL code here
这样,当我们运行dbt run
命令时,dbt 会创建一个表而不是一个视图。
关于视图和表的区别,这里我给一些比较生硬但明显的区别:
dbt run
时重新填充。表是数据库中存储数据的主要结构。与视图不同,表会存储数据。当你查询表时,你会直接获取存储在表中的数据,而不需要重新计算或检索数据。表的一些特点:
总结起来,视图和表在用途上可能有很多相似之处,但表是实打实的数据,而视图是一个中间态的数据,前者可以CRUD直接操作,而视图只能查,像修改只能 dbt run 完整更新。
那么到这里,第一篇文章结束,第二篇我们详细聊下 dbt 配置,以及一些更进阶的用法,比如区分 dev prod 将模型写入不同目标数据集等等,关于本文有任何走不通的地方或者疑问环境留言提问。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!