从零开端的 dbt 入门教程 (dbt-core 根底篇)

最近一向在处理数据剖析和数据建模的作业,所以触摸了 dbt 等数据剖析的东西,国内目前关于 dbt 比较具体的材料不多,所以打算写四道五篇 dbt 相关的文章,本文归于 dbt 系列的第一篇,本篇首要论述 dbt 一些根本概念,教会你怎么装备 dbt 衔接远端数据库,并运转你的第一个数据模型,那么本文开端。

一、一些数据剖析或许需求知晓的前置概念

1.1 什么是 dbt?

DBT(Data Build Tools)是一种数据转化作业流东西,作为数据剖析师,咱们需求将原始的数据进行各类加工组合来应对更为杂乱的数据剖析需求。精确来说,dbt 仍是来写 sql 做各种数据查询,你或许会想,那我自己写 sql 不就完事了,还用啥 dbt。事实上,由于数据库品种繁复,sql 会存在兼容问题;其次,数据转化会存在数据依靠,比方底层原始数据层层转变为事务数据,你或许需求自己来维护这个依靠联系,其实细心一想,你就会发现自己做会十分麻烦。

咱们能够把 DBT 想象成一个厨师,而原始数据就像是食材。厨师(DBT)的作业便是把食材(原始数据)加工成好吃的菜(有用的数据模型)。这个进程就像是烹饪相同,需求依照一定的次序和步骤来操作。

DBT 的作业流程就像是烹饪的步骤,咱们只需求告诉 DBT 想做什么菜(即你想要的数据模型是什么样的,当然 sql 肯定得自己写),然后,DBT 会依照你的指示,一步步地处理食材(即处理原始数据),最终做出你想要的菜肴(即生成你需求的数据模型)。

其实说到这,你就能明白 dbt 能让咱们更聚焦在咱们想要什么数据,界说怎样的数据模型,其余的作业流全权交给 dbt 即可,这便是 dbt 的效果。

1.2 dbt core 与 dbt cloud 的差异

咱们在 dbt 文档最初会留意到两个比较重要的名词,dbt core 和 dbt cloud,新手或许现已不知道该从哪个下手了,这儿先解说下差异:

  • dbt core:dbt Coredbt 的开源部分,它供给了数据建模、转化和办理的中心功用。运用 dbt Core,你能够界说和运转数据转化模型,生成 SQL 查询,并将数据写入方针数据仓库(如BigQuery、Snowflake等)。总而言之,你接下来要运用的 dbt 指令都是依据 dbt core,所以这个有必要装置(后面细说)。
  • dbt Cloud: dbt Clouddbt 的云服务,构建在 dbt Core 的根底之上。它供给了托管服务,CI/CD 部署以及图形化的用户界面,能让你直接在渠道运转 dbt 模型而无需自己设置和树立根底设施,关于 dbt cloud 我后续单独出一篇文章。

总而言之,便是 saas 付费服务和开源本地化自行树立的差异,那么本文自然是从 dbt core 的视角出发了。

1.3 什么是 dbt adapters?

除了 dbt core,第二个重要的概念是 dbt adapters,也便是 dbt 适配器,并且咱们要做数据处理一定是装置 dbt core + 某个数据库所对应的适配器。

咱们都知道不同的数据库在 SQL 查询上都会有些许差异,要记住一切类型的特定语法成本高但收益低,适配器正好帮咱们做了这件事,适配器的效果之一是供给一种标准化的接口,让你能够运用相同的 SQL 语法来与不同的底层数据渠道交互,而不需求重视 SQL 句子自身。

dbt 自身供给的适配器就十分多,除了官网维护的适配器之外,还有社区自行维护且受 dbt 官方认可的适配器,所以从数据渠道(比方 bigQuery、Postgres)到数据库(比方 mysql)自身。 dbt 为一切的适配器都供给了独立的文档,以及装备说明,咱们依据自己的数据库类型能够直接来这个文档目录搜索检查即可。

从零开端的 dbt 入门教程 (dbt-core 根底篇)

1.4 什么是 ELT 和 ETL ,它们差异在哪?

ELT 和 ETL 是两种常见的数据剖析形式,它们在数据处理流程中的步骤次序上有所不同。

  1. ETL:

    • 提取(Extract): 从源体系中提取数据。
    • 转化(Transform): 对提取的数据进行清洗(比方去除空值)、加工、转化。
    • 加载(Load): 将经过转化的数据加载到方针体系,一般是数据仓库。 在 ETL 形式中,数据在提取后经过一系列杂乱的转化操作,然后再加载到方针体系。这种形式适用于需求对数据进行屡次、杂乱转化的状况,比方将多个源的数据兼并,进行聚合等。
  2. ELT(提取、加载、转化):

    顾名思义,在数据处理次序上有所不同。ELT 形式中,数据首要加载到方针体系,然后在方针体系内进行转化。这种形式适用于方针体系有满足核算资源的状况,能够在方针体系中直接处理原始数据。

两者差异:

  • ETL 的优势: ETL 适用于需求在数据抵达方针体系前进行杂乱的数据清洗和转化的状况。它能够将清洗和转化的逻辑分离出来,保证方针体系中的数据是高质量的。
  • ELT 的优势: ELT 更适用于云数据仓库等具有强壮核算才能的体系( 比方 bigQuery )。它允许直接在方针体系中处理原始数据,削减了数据传输的杂乱性,适用于大规模数据处理。

1.5 Dbt ,bigQuery 与 Fivetran 的效果

了解 ELT(Extract, Load, Transform)和 ETL(Extract, Transform, Load)的概念有助于更好地了解这三个东西在数据处理和剖析中的人物。

  1. Fivetran:
    • ELT人物: Fivetran 首要担任从各种数据源提取(Extract)数据,并将这些数据加载(Load)到方针数据仓库,如 BigQuery。
    • 效果: Fivetran 简化了数据提取和加载的进程,使数据预备的阶段愈加快速和无缝,除此之外,Fivetran 还会做部分数据预处理作业,大致才能:
      1. 数据格局转化: Fivetran 能够处理来自不同数据源的数据,并将其转化为合适方针数据仓库的格局。这或许涉及日期格局、数字格局等的调整。
      2. Schema映射: Fivetran 会依据方针数据仓库的结构映射,将数据源的表和字段映射到方针仓库中的对应结构。
      3. 增量同步: Fivetran 一般支撑增量同步,只同步源数据中发生变化的部分,以削减数据传输的成本。
      4. 过错处理: 处理在数据加载进程中或许呈现的过错,保证数据的完好性。
      5. 功能优化: 优化数据加载的功能,以保证数据能够及时可用。
  2. BigQuery:
    • ELT人物: BigQuery 在 ELT 流程中扮演 Load 阶段的人物。它是一个云数据仓库,担任存储和处理加载进来的原始数据。
    • 效果: BigQuery 供给强壮的分布式查询引擎,允许用户在原始数据上履行杂乱的 SQL 查询,进行初步的数据剖析。
  3. dbt:
    • ELT和ETL人物: dbt 既能够在 ELT 形式下运用,也能够在 ETL 形式下运用,取决于具体的架构规划。在 ELT 中,dbt 用于数据转化和建模,一般在加载后的原始数据上履行。在 ETL 中,dbt 能够与其他 ETL 东西配合运用,用于界说和履行更杂乱的数据转化逻辑。
    • 效果: dbt 的首要效果是界说和履行数据模型,供给了一种可维护、可测验的方法来构建和办理剖析模型。

全体流程:

  1. ELT流程:
    • Extract(Fivetran): 从各种数据源提取数据。
    • Load(Fivetran和BigQuery): Fivetran 将数据加载到 BigQuery 中。
    • Transform(dbt): 运用 dbt 在 BigQuery 中创立和维护剖析模型。
  2. ETL流程:
    • Extract(Fivetran): 从各种数据源提取数据。
    • Transform(dbt等东西): 运用 dbt 或其他 ETL 东西界说和履行数据转化逻辑。
    • Load(BigQuery): 将转化后的数据加载到 BigQuery 或其他数据存储中。

这种结合 ELT 和 ETL 的方法,利用了 Fivetran 的强大数据加载才能,同时经过 dbt 供给的数据建模东西,完成了灵活而可维护的数据处理和剖析流程。

1.6 dbt 担任的数据转化,而 Fivetran 也能做数据转化,那为什么还需求dbt?

  1. Fivetran: Fivetran 首要专心于数据集成,即将数据从不同的源头传输到方针数据仓库。它强调的是数据的可靠、高效的移动。尽管 Fivetran 供给了一些根本的预处理功用,但它并不是一个专门用于杂乱数据转化和事务逻辑的东西。它的方针是供给一个易于运用的渠道,使得数据工程师能够快速地设置和办理数据流。
  2. dbt: dbt(data build tool)则专心于数据转化和建模。它在数据仓库中履行转化和汇总,以便为剖析供给更具可读性和易用性的数据结构。dbt 允许剖析师界说事务逻辑、创立衍生字段、履行聚合等操作,将原始的仓库数据转化为更简略了解和运用的形式。dbt 的强项在于支撑剖析人员更好地了解和运用数据,而不仅仅是数据的传输和存储。

归纳考虑,Fivetran 和 dbt 能够协同作业。Fivetran 担任将数据从源头搬移到数据仓库,而 dbt 则担任在数据仓库中进跋涉一步的处理和建模,以便更轻松地进行杂乱的查询和剖析。简略了解,Fivetran 只供给了根底的数据清洗和转化,而 dbt 供给更专业更强壮更自由的数据转化。

二、 dbt 环境预备(这儿以 Python 为例)

2.1 Python 版别留意

与 npm 需求依靠 node 相同,pip 指令也需求装置 Python,关于版别这儿推荐装置 3.8 3.9 即可,不要装置 3.10。我在装置了 Python 3.10 后呈现了装置 mysql 适配器和 core 包时,一向只能装置 0.19.2 的状况,而 core 最新的版别都到了1.1.6,导致我一向陷入了包版别是对的,可是 core 与 mysql 适配器依靠包版别过错需求处理版别冲突的怪圈中,这点切记。

2.2 装置 dbt core

上文现已说到 dbt core 归于 dbt 的开源中心,咱们后续运用的指令都由这个包供给。装置 dbt core 的方法有许多,官方支撑 pip、docker、homebrew 等等。

上文咱们现已装置了 Python ,所以咱们在终端履行如下指令即可:

pip install dbt-core

dbt 默许大局装置,所以即便你在某个项目途径下,它仍是会依据大局装置,在装置完结之后,咱们能履行如下指令检查装置是否完结。

pip show dbt-core

比方我装置的便是 core 1.1.6 版别,这儿就能看到装置的版别,途径等相关信息。

从零开端的 dbt 入门教程 (dbt-core 根底篇)

2.3 装置 dbt adapters

咱们后续一切作业,都将依据 core 与 adapters 两个包来完结,其实预备来说,当咱们履行装置某个适配器时,这个指令会默许装置与之关联的 core 包,也便是一个指令主动装置两个包,这儿咱们以 bigQuery 为例:

pip install dbt-bigquery

同理,装置之后能够履行指令检查装置包的版别等信息:

pip show dbt-bigquery

某些状况下,你先履行了下载适配器的指令,会默许帮你 core 包,你也许想单独再装置更高版别的 core 包,你能够经过卸载重装的形式来完结,比方:

## 先卸载
pip uninstall dbt-core
## 再装置履行版别包
pip install dbt-core==1.1.6

以上便是 dbt 两个中心的包了,咱们只需求装置这两个包就能支撑接下来的一切作业,再做个总结,解说下两个包的效果:

  • dbt-core:开源的中心包,装置了这个你才能履行 dbt 指令。
  • 适配器包(dbt-bigquery):数据库渠道、数据库兼容的包,帮你抹平不同数据库的指令差异,并且接下来咱们链接对应的数据库,都需求提早装置对应的适配器。

由于数据库品种繁复,适配器支撑状况具体可检查官网关于不同数据库的支撑状况。

四、初始化 dbt

4.1 经过指令

或许到这儿,咱们觉得装置完适配器以及dbt core 就现已够了,然后咱们在终端直接经过指令链接数据库进行操作,其实不是的。咱们需求初始化一个项目,并且咱们还需求在项目中编写数据模型句子,以及一些根本的装备代码。

初始化一个 dbt 项目有两种方法,第一种是直接经过指令:

## 你能够在你的项目目录下运转
dbt init

之后 dbt 会帮你创立一个模版项目,假定你呈现了 dbt 指令不存在的报错,那么便是你的 dbt core 包没装置好,你应该从头走上文的指令,以及经过 pip show dbt-core 来检查你的 core 版别信息。

4.2 运用官网模版项目

除了指令,其实我更推荐运用官网的模版项目,由于 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 的项目整个上传服务器,经过远端来联调数据库,前端同学如果不清楚,能够问下服务端同学日常开发怎么做的就好了。

5.1 创立 profiles.yml 文件

咱们需求在之前 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

5.2 解说下装备

首要 jaffle_shop 这个字段需求跟咱们项目根目录下 dbt_project.yml 中的 profile 特点字段相同,你能够取任何姓名,但两边得保持一致。

从零开端的 dbt 入门教程 (dbt-core 根底篇)

**target:**dbt 项目自身也有分支和环境的差异,现在咱们便是学习和测验,所以这儿环境能够界说为 dev 即可。

type:你所运用适配器所对应的数据库称号,由于咱们运用的是 bigquery,所以这儿填 bigquery 即可。

**method:**固定装备,不必改。

**project:**项目名,留意是你的项目名,当然也或许叫数据容器名,便是最外层的容器名。

**dataset:**数据集称号,一般一个数据集下包含多张数据表,所以这个联系便是数据库—数据集–数据表的联系。但需求留意的是,一般数据库有N个数据集,咱们操作数据也不或许只操作一个数据集,所以这儿的 dataset 仅仅作为默许值,如果咱们有数据库一切权限,仍是能查询一切数据集,不过它会影响 dbt seed 数据库新表的创立方位,一般咱们 dataset 供给哪,seed 指令创立的新表就在哪。总而言之,不影响查询数据转化,可是影响 seed 和咱们 model 新表、视图创立的方位。

threads:用于指定运转 dbt 任务时的并发线程数。运用多个线程,能够加快 dbt 流水线的履行速度,这儿咱们也默许 4 即可。

keyfile:链接 Google 数据库也需求授权,简略了解便是一份秘钥,由于我的秘钥也直接放在了项目根途径,所以我这儿直接引即可。

5.3 检查链接是否成功

装备完结后,咱们履行 dbt debug 能够检查项目与数据库的链接状况,比方:

从零开端的 dbt 入门教程 (dbt-core 根底篇)

那么到这儿,咱们成功让 dbt 项目链接到了远端数据库,要做数据剖析或许建模,咱们肯定得提早往数据库写入部分数据然后再依据数据做剖析,运用上文说到的 jaffle_shop 模版项意图好处便是,项目直接为咱们预备好了数据文件和模型文件,现在让咱们履行如下指令:

## 将项目中 scv 数据文件写入衔接的数据库
dbt seed

## 运转整个 dbt 项目,开端数据建模
dbt run

在履行完结后,当咱们来到数据库中的 dev_data_statistics 数据集,在此数据集下即可看到 jaffle_shop 中所界说的模型文件。有一个小技巧,dbt 在数据库中创立的一切模型称号都默许是咱们的 sql 文件名,这十分便利咱们对应查找表或许视图。

那么道理,咱们根本走完了一个 dbt 流程,成功装备且运转了归于咱们第一批数据模型。

六、dbt 指令注解

顺带,我整理了部分 dbt 指令注解:

  • build:依照指定的次序运转一切的数据加载、数据模型、数据快照和数据测验。这个指令会编译 SQL 并履行相应的操作,构建数据仓库。
    • build 包含了 seed 、run、test、snapshot,也便是把原始数据参加数据库,依据模型生成视图,测验用例以及生成快照。
  • clean:删除指定的文件夹,一般用于整理生成的文件或目录。
  • clone:创立一个节点的副本,能够在项目中复制和重用节点。这个指令能够协助你快速创立相似的数据模型。
  • compile:将 dbt 项目中的代码转化为可履行的 SQL 句子,这个指令能够协助你检查和验证你的代码是否正确。
  • debug:显现当时 dbt 环境和装备的信息(上面用过了),这个指令能够协助你了解当时的 dbt 设置和环境变量。
  • deps:更新项目中运用的依靠项,以获取最新版别的依靠库(dbt 也有三方包,后续文章讲)。
  • docs:生成或供给你的项意图文档网站,这个指令能够协助你生成和检查项意图文档,以便其他人了解你的数据模型和操作。
  • init:初始化一个新的 dbt 项目,这个指令会创立一个新的 dbt 项目,并生成必要的文件和目录结构,以便你开端构建数据仓库。
  • list:列出项目中的资源,如数据模型、表、视图等。这个指令能够协助你检查项目中的一切资源。
  • parse:解析项目并供给关于功能的信息,这个指令能够协助你了解项意图结构和功能,以便进行优化。
  • retry:从头运转前次运转失败的节点,这个指令能够协助你从头运转失败的数据模型或操作,以处理过错。
  • run:编译 SQL 并运转指定的数据模型或操作。这个指令用于履行 dbt 项目中的数据模型和操作,以构建数据仓库。
    • seed 和 run 的差异:
      • seed 的首要意图是加载原始、静态的数据,这些数据一般不需求常常变化,例如国家列表、产品类别等。seed 会担任将这些静态数据加载到数据库中,为后续的剖析和转化供给根底数据。
      • run 的首要意图是运转数据模型,经过履行 SQL 查询和转化逻辑,生成新的表、视图或许其他的数据结构。这些模型或许依靠于 seed 导入的数据,也或许依靠于其他模型生成的数据。
    • 有时候咱们只想运转某个 model 而不是一切 models ,经过 –model 能够履行运转某个 model,比方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 视图(view)和表(table)的差异

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 会创立一个表而不是一个视图。

关于视图和表的差异,这儿我给一些比较生硬但明显的差异:

  • 视图(view):视图的首要效果是供给一个虚拟的表,它是依据一个或多个表的查询成果而创立的。视图能够看作是一个预界说的查询,它将查询逻辑封装在其间,并供给一个简化和抽象的接口来拜访和操作数据,留意,视图自身不存储数据。视图在以下状况下很有用:
    • 视图是一个虚拟的表,它是依据一个或多个表的查询成果而创立的,你能够运用视图来对原始数据进行聚合、核算和转化,以生成更高层次的指标和洞察。(视图只读,不能增修正)
    • 视图不存储实践的数据记载,而是依据查询逻辑动态生成成果。
    • 视图能够看作是一个预界说的查询,它将查询逻辑封装在其间,并供给一个简化和抽象的接口来拜访和操作数据。
    • 视图能够简化杂乱的查询操作,进步查询的效率和可读性。
    • 视图能够用来约束对数据的拜访权限,只暴露需求的数据给用户,视图能够用于约束用户对敏感数据的拜访。经过在视图中运用过滤器、权限和安全规矩,你能够操控用户对数据的拜访权限,保证只有授权的用户能够检查和运用特定的数据。
  • 表格(table):这会在你的数据仓库中创立一个实体表,并在每次dbt run时从头填充。表是数据库中存储数据的首要结构。与视图不同,表会存储数据。当你查询表时,你会直接获取存储在表中的数据,而不需求从头核算或检索数据。表的一些特点:
    • 表是数据库中的实践存储对象,它包含了实践的数据记载。
    • 表能够存储和办理许多的数据,能够进行增修正查等操作。
    • 表具有物理结构,包含列和行,每一行代表一个数据记载,每一列代表一个特点。
    • 表的数据是实时更新的,当对表进行增修正操作时,数据会直接在表中进行修正。

总结起来,视图和表在用途上或许有许多相似之处,但表是实打实的数据,而视图是一个中间态的数据,前者能够CRUD直接操作,而视图只能查,像修正只能 dbt run 完好更新。

那么到这儿,第一篇文章完毕,第二篇咱们具体聊下 dbt 装备,以及一些更进阶的用法,比方区别 dev prod 将模型写入不同方针数据集等等,关于本文有任何走不通的当地或许疑问环境留言提问。