Skip to content

什么是包?

软件工程师经常将代码模块化到库中。这些库有助于程序员发挥杠杆作用:他们可以花更多的时间专注于自己独特的业务逻辑,而花更少的时间实现其他人已经实现的代码。

在dbt中,像这样的库被称为 。dbt的软件包非常强大,因为我们遇到的许多分析问题都是跨组织共享的,例如:

  • 从结构一致的SaaS数据集转换数据,例如:
  • AdWords 或者 Facebook Ads 的消费支出数据转换成统一的格式.
  • 编写执行类似功能的dbt宏,例如
  • generating SQL to union together two relations, pivot columns, or construct a
  • 创建 自定义schema测试
  • 编写 审计查询
  • 为数据栈中使用的特定工具构建模型和宏,比如:
  • 理解Redshift的权限.
  • 使用Stitch加载宏.

dbt 实际上是独立的dbt项目,具有解决特定问题领域的模型和宏。作为dbt用户,通过将包添加到项目中,包的模型和宏将成为您自己项目的一部分。这意味着: * 当你执行dbt run时,包里的模型将被物化. * 您可以在自己的模型里使用ref函数引用包里的模型. * 您可以在自己的项目中引用包里的宏.

使用Python包

定义和安装dbt包与定义和安装Python包不同

怎么在项目里添加一个包?

  1. 在你的dbt项目中添加一个packages.yml文件, 这个文件应该与您的·dbt_project.yml·文件处于同一目录
  2. 使用支持的语法之一指定要添加的包,比如:

packages:
  - package: dbt-labs/snowplow
    version: 0.7.0

  - git: "https://github.com/dbt-labs/dbt-utils.git"
    revision: 0.9.2

  - local: /opt/dbt/redshift

执行dbt deps安装包,包被安装在dbt_Packages目录中——默认情况下,git会忽略此目录,以避免重复包的源代码。

如何指定一个包?

根据包的存储位置,可以使用以下方法之一指定包。

Hub包 (推荐)

dbt Hub统一存放dbt包. dbt Hub上列出的包可以这样安装:

packages:
  - package: dbt-labs/snowplow
    version: 0.7.3 # version number

包需要指定一个版本 – 您可以在dbt Hub上找到最新的版本号。由于Hub包使用语义版本控制,我们建议将您的包固定到特定次要版本的最新补丁版本,如下所示:

packages:
  - package: dbt-labs/snowplow
    version: [">=0.7.0", "<0.8.0"]

在可能的情况下,我们建议通过dbt Hub安装包,因为这允许dbt处理重复的依赖关系。这在以下情况下很有帮助:

  • 您的项目同时使用dbt-utils和Snowplow包;Snowplow包也使用dbt-utils包.
  • 您的项目同时使用Snowplow和Stripe包,这两个包都使用dbt-utils包.

相比之下,其他包安装方法无法处理重复的dbt-utils软件包。

预发版本

一些包维护人员可能希望将预发布版本的包推送到dbt Hub,以便测试新功能或与新版本的dbt的兼容性。预发布版本由后缀界定,如a1(第一个alpha)、b2(第二个beta)或rc3(第三个候选版本)。

默认情况下,在解析包依赖关系时,dbt deps将不包括预发布版本。您可以通过以下两种方式之一启用预发行版的安装: - 在version条件中明确指定预发布版本 - 将install prerelease设置为true,并提供兼容的版本范围

以下两种配置都将成功安装dbt_artifacts0.4.5a2

packages:
  - package: brooklyn-data/dbt_artifacts
    version: 0.4.5a2
packages:
  - package: brooklyn-data/dbt_artifacts
    version: [">=0.4.4", "<0.4.6"]
    install-prerelease: true

Git包

存储在Git服务器上的包可以使用Git语法安装,如下所示:

packages:
  - git: "https://github.com/dbt-labs/dbt-utils.git" # git URL
    revision: 0.9.2 # tag or branch name

添加包的Git URL,并可以选择指定修订版。修订可以是: - 一个branch name - 一个tagged release - 一个指定的commit

指定40个字符哈希的修订示例:

packages:
  - git: "https://github.com/dbt-labs/dbt-utils.git"
    revision: 4e28d6da126e2940d17f697de783a717f2503188

我们 强烈建议 通过指定发行版名称将您的包固定到特定的发行版。

如果您没有提供修订版,或者使用master,那么下次运行dbt deps时,对包的任何更新都将合并到您的项目中。虽然我们通常会尽量避免对这些包进行破坏性的更改,但它们有时是不可避免的。固定包修订版有助于防止您的代码在未经明确批准的情况下发生更改。

要查找包的最新版本,请转到相关GitHub中的Release选项卡。例如,您可以在这里找到dbt-utils包的所有版本.

从v0.14.0开始,如果您在不指定版本的情况下使用git语法安装包,dbt将向您发出警告(请参见下文)。

私有包

SSH Key方法 (仅命令行)

如果使用命令行,则可以通过SSH和SSH密钥克隆私有包。

当您使用SSH密钥向git远程服务器进行身份验证时,不需要每次都提供用户名和密码。阅读更多关于SSH密钥、如何生成它们以及如何将它们添加到git提供程序的信息:GithubGitLab.

packages:
  - git: "git@github.com:dbt-labs/dbt-utils.git" # git SSH URL

Git Token方法

此方法允许用户通过HTTPS通过环境变量传入git令牌进行克隆。请注意您使用的任何令牌的过期日期,因为过期的令牌可能会导致计划运行失败。此外,如果用户失去对特定仓库的访问权限,用户token可能会丢失。

本地包

可以通过指定项目的路径来安装本地存储的包,如下所示:

packages:
  - local: /opt/dbt/redshift # use a local path

本地包只应用于特定情况,例如,在测试包的本地更改时。

哪些包可用?

Check out dbt Hub 查看已经发布的dbt包!

包的高级配置

升级包

当您更新packages.yml文件中的版本或修订版时,它不会在dbt项目中自动更新。您应该运行dbt deps来更新包。您可能还需要运行此软件包中的模型的full refresh

卸载包

packages.yml文件中删除包时,它不会自动从dbt项目中删除,因为它仍然存在于dbt_packages/目录中。如果您想完全卸载包,您应该:

  • 删除dbt_packages/里的包目录,或者
  • 执行dbt clean删除 所有 包,然后执行 dbt deps.

配置包

您可以在dbt_project.yml文件里配置包中的模型和(seeds)种子,如下所示:

vars:
  snowplow:
    'snowplow:timezone': 'America/New_York'
    'snowplow:page_ping_frequency': 10
    'snowplow:events': "{{ ref('sp_base_events') }}"
    'snowplow:context:web_page': "{{ ref('sp_base_web_page_context') }}"
    'snowplow:context:performance_timing': false
    'snowplow:context:useragent': false
    'snowplow:pass_through_columns': []

models:
  snowplow:
    +schema: snowplow

seeds:
  snowplow:
    +schema: snowplow_seeds

例如,当使用特定于数据集的包时,您可能需要为包含原始数据的表的名称配置变量。

dbt_project.yml文件中进行的配置将覆盖包中的任何配置(包的dbt_project.yml文件中或配置块中)。

指定未固定的Git包

如果你的项目指定了一个未固定的Git包,你可能会看到这样的警告:

The git package "https://github.com/dbt-labs/dbt-utils.git" is not pinned.
This can introduce breaking changes into your project without warning!

可以设置warn-unpinned:false来取消此警告. 注意: 不建议这样做。

packages:
  - git: https://github.com/dbt-labs/dbt-utils.git
    warn-unpinned: false