搭建DBT项目(二)

736 阅读6分钟

上篇内容,如果是对DBT不太熟悉的小白,建议从DBT介绍这篇文章开始阅读。

2.2、Models

2.2.1、关于models

在dbt环境中,模型是开发人员花费大部分时间的地方。模型主要以select语句的形式编写,并保存为.sql文件。虽然定义很简单,但执行的复杂性会因环境而异。随着需求的发展和您的公司找到最大化效率的新方法,模型将被编写和重写。

SQL是大多数dbt用户将使用的语言,但它不是构建模型的唯一语言。从1.3版本开始,dbt Core和dbt Cloud都支持Python模型。Python模型对于训练或部署数据科学模型、复杂转换,或者在特定的Python 包满足需求时非常有用——例如使用dateutil库解析日期。

2.2.2、SQL models

SQL模型是一个select语句。模型是在.sql文件中定义的(通常在models目录中):

  • 每个.sql文件包含一个select语句
  • 模型名从文件名继承。
  • 模型可以嵌套在models目录中的子目录中

当执行dbt run命令时,dbt通过将它包裹在create view as或create table as语句中来构建该模型。

例如,参考以下customers模型:

image.png

当你执行dbt run时,dbt会在你的目标schema中构建一个名为customers的视图。

为什么是名为customers的视图?默认情况下dbt将:

  • 将模型创建为视图
  • 在您定义的目标schema中构建模型
  • 使用您的文件名作为数据库中的视图或表名

FAQs:

  1. 如何查看dbt正在运行的SQL?
  • target/compiled/目录中已编译的select语句
  • target/run/目录中已编译的create语句
  • 用于详细日志记录的logs/dbt.log文件
  1. 需要在运行dbt之前创建目标schema吗?

    不需要!DBT将在运行时检查schema是否存在。如果schema不存在,dbt将创建它。

配置models

配置是可以在dbt_project.yml文件中models:键下面设置的,或者在您的模型文件中使用配置块。一些配置示例包括:

  • 更改模型使用的 materialization — materialization决定dbt在仓库中创建模型时使用的SQL。
  • 将模型构建到单独的schema中。
  • 将标签应用到模型。

下面是一个模型配置的例子:

image.png

要注意配置是层级应用的,应用到子目录的配置将覆盖任何通用的配置或者父级配置。

FAQs:

  1. dbt中有哪些materialization可用?

    DBT附带四种materialization:view、table、incremental和ephemeral。另外也可以创建自定义 materialization。

  2. 哪些配置可以存在于model配置中?

  • 支持轻松分类和图形选择的标签tags
  • 自定义schema以将您的模型拆分到多个schema
  • 如果您的视图/表名称应与文件名不同,则使用别名alias
  • 在模型的开头或结尾运行的 SQL 片段,称为钩子hooks
  • 仓库特定的性能配置(例如 Redshift 上的 sort 和 dist 键,BigQuery 上的分区)

模型之间构建依赖关系

通过在query中使用ref函数代替表名,您可以在模型之间建立依赖关系。 使用另一个模型的名称作为 ref 的参数。

image.png

dbt 使用 ref 函数来:

  • 通过创建DAG来确定运行模型的顺序。
  • 管理单独的环境——dbt 将用表(或视图)的数据库名称替换 ref 函数中指定的模型。 重要的是,这 是环境感知的——如果您在名为 dbt_alice 的目标schema中运行 dbt,它将从同一schema中的上游 表中进行选择。 此外, ref 函数鼓励您编写模块化转换,以便您可以重用模型,并减少重复代码。

FAQs:

  1. 我可以将模型存储在项目中的“models”目录以外的目录中吗?

    默认情况下,dbt 期望您的模型文件位于项目的models子目录中。 要更改此设置,请更新 dbt_project.yml 文件中的model-paths配置.

    model-paths: ["transformations"]

  2. 可以在目标schema以外的schema中构建模型,或者将模型拆分到多个schema中吗?

    使用 dbt_project.yml 文件中的schema配置,或使用配置块:

image.png

  1. 模型的名字需要唯一吗?

    是的! 要在模型之间建立依赖关系,您需要使用 ref 函数。 ref 函数只接受一个参数——模型名称 (即文件名)。因此,这些模型名称必须是唯一的,即使它们位于不同的文件夹中。 通常,出现这个问题是因为用户希望在他们的仓库中为两个模型提供相同的名称,将它们拆分为不同 的模式(例如 stripe.users 和 app.users)。 查看有关自定义别名和自定义模式的文档以实现此目 的。

  2. 如何从数据仓库中删除已删除的模型?

    如果从dbt项目中删除一个模型,dbt不会自动从模式中删除该关系。当您从dbt项目中删除模型时,您应该手动从schema中删除相关的表或视图。

2.3、Seeds

概要

seed是dbt项目中的CSV文件(通常在seed目录中),dbt可以使用dbt seed命令将其加载到数据仓库中。 seed可以在下游模型中引用,方法与引用模型相同——通过使用ref函数。 因为这些CSV文件位于您的dbt存储库中,所以它们是版本控制和代码可审查的。seed最适合于不经常变化的静态数据。

示例

在dbt项目中加载种子(seed)文件:

  1. 将文件添加到seeds目录,扩展名为.csv文件,例如seeds/country_codes.csv
  2. 运行dbt seed命令—将在目标schema中创建一个名为country_codes的新表
  3. 在下游模型中使用ref函数引用种子。

FAQs:

  1. 我可以使用种子加载原始数据吗? 种子不应用于加载原始数据(例如,从生产数据库导出的大型CSV)。使用dbt的种子功能加载csv对于大文件来说性能不佳。考虑使用不同的工具将这些csv加载到数据仓库。

  2. 我可以将我的种子存储在我的项目的' seeds '目录之外的目录中吗?

    默认情况下,dbt希望种子文件位于项目的seeds子目录中。 要改变这一点,请更新dbt_project.yml文件中的种子路径配置。像这样:

    seed-paths: ["custom_seeds"]

  3. 我的种子的列改变了,运行“seed”命令得到一个错误时,应该做什么?

    如果你改变了种子的列,你可能会得到一个数据库错误: 在这种情况下,你应该用 --full-refresh标志重新运行命令,像这样: dbt seed --full-refresh 为什么会这样呢? 通常在运行dbt seed时,dbt会截断现有表并重新插入数据。此模式避免了drop cascade命令,后者可能导致下游对象(您的BI用户可能正在查询的对象!)被丢弃。 但是,当更改列名或添加新列时,这些语句将失败,因为表结构已更改。 --full-refresh标志将强制dbt在重建之前drop cascade现有表。