在软件开发中,通常会将代码模块化到库中,以便利用已有的代码来提高效率。这使得程序员可以更专注于自己的业务逻辑,而不必花费过多时间在实现已有代码方面。
在dbt中,像这样的库被称为包。dbt的软件包非常强大,因为我们遇到的许多分析问题都是跨组织共享的,例如:
- 从结构一致的数据集中转换数据
- 编写执行类似功能的dbt宏
- 为数据项目中使用的特定工具构建模型和宏
dbt包是一个独立的dbt项目,其中包含解决特定问题领域的模型和宏。作为dbt用户,可以通过添加包来将其包含在您自己的项目中,以便使用包中的模型和宏,因此可以实现 以下目标:
- 当dbt run命令时,包中的模型将具体化保存到目标数据仓库中。
- 可以在自己的模型中使用ref来引用包中的模型。
- 可以在自己的项目中使用包中的宏。
如何在项目中调用其他的包?
- 将packages.yml文件添加到dbt项目中,与dbt_project.yml文件处于同一级别。
- 使用支持的语法之一指定要添加的包,例如在packages.yml文件中配置如下:
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会忽略此目录。
包的调用
根据包的保存位置,可以使用以下方法之一指定包。
Git包
存储在Git服务器上的包可以使用Git语法安装,如下所示:packages.yml
packages:
- git: "https://github.com/dbt-labs/dbt-utils.git" # git URL
revision: 0.9.2 # tag或者分支名称
添加包的Git URL,并可选择指定版本。 版本可以是:
- 分支名称
- 发布的tagged
- 提交git产生的hash字符串,例如:
packages:
- git: "https://github.com/dbt-labs/dbt-utils.git"
revision: 4e28d6da126e2940d17f697de783a717f2503188
内部托管的tarball URL
有些公司有只从内部服务获取资源的安全要求。为了满足从托管环境(如云存储)安装包的需求,dbt Core使您能够从内部托管的tarball URL安装包。
packages:
- tarball: https://codeload.github.com/dbt-labs/dbt-utils/tar.gz/0.9.6
name: 'dbt_utils'
其中名称:“dbt_utils”指定为要安装的包源代码创建的dbt_packages的子文件夹。
私有包
使用命令行可以通过SSH和SSH密钥克隆私有包,使用SSH密钥进行身份验证时无需每次提供用户名和密码。
packages:
- git: "git@github.com:dbt-labs/dbt-utils.git" # git SSH URL
另外Git Token方法允许用户通过HTTPS通过环境变量传入git令牌进行克隆。例子如下:
packages:
# 通过github应用程序令牌访问存储库时使用此格式
- git: "https://{{env_var('DBT_ENV_SECRET_GIT_CREDENTIAL')}}@github.com/dbt-labs/awesome_repo.git" # git HTTPS URL
# 通过私有访问令牌访问存储库时使用此格式
- git: "https://{{env_var('DBT_ENV_SECRET_GIT_CREDENTIAL')}}@github.com/dbt-labs/awesome_repo.git" # git HTTPS URL
# 通过细粒度的私有访问令牌访问存储库时使用此格式(有时需要用户名)
- git: "https://GITHUB_USERNAME:{{env_var('DBT_ENV_SECRET_GIT_CREDENTIAL')}}@github.com/dbt-labs/awesome_repo.git" # git HTTPS URL
本地包
可以通过指定项目的路径来安装本地存储的包,如下所示:
packages:
- local: /opt/dbt/redshift # use a local path
配置包
可以从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
上面例子是需要配置变量来命名包含原始数据表的名称,尤其是在使用特定于数据集的包时。