Snowflake 上的 dbt 项目¶
dbt Core (https://github.com/dbt-labs/dbt-core) 是一个开源数据转换工具和框架,可用于定义、测试和部署 SQL 转换。借助 dbt Projects on Snowflake,您可以使用熟悉的 Snowflake 功能来创建、编辑、测试、运行和管理您的 dbt Core 项目。dbt 项目 是一个目录,其中包含一个 dbt_project.yml
文件和一组定义 dbt 资产(例如模型和来源)的文件。
您可以在 Snowsight 中使用 工作区 来处理 dbt 项目文件和目录,然后将项目部署为架构级 DBT PROJECT 对象。您还可以使用 SQL 来处理 dbt 项目对象、使用 Snowflake CLI 命令 将部署和执行集成到您的 CI/CD 工作流程、使用 任务 来计划和编排 dbt 项目运行,以及使用 Snowflake 监控工具 检查、管理和调整项目运行。
将工作区用于 dbt Projects on Snowflake¶
Snowsight 中的工作区为 dbt 项目提供基于 Web 的集成开发环境 (IDE),该环境可以连接并同步到 Git 存储库。dbt Projects on Snowflake 的每个工作区可以代表单个 dbt 项目或多个 dbt 项目,具体取决于您组织文件和文件夹的方式。
您可以使用 dbt Projects on Snowflake 的工作区直接在 Snowflake 中可视化、测试和运行 dbt 项目。您还可以将工作区连接到 Snowflake 中的 dbt 项目对象,这样您就可以从工作区创建和更新对象。工作区还提供了一种快速初始化(或构建)新 dbt 项目的方法,该方法会为 dbt 项目创建必要的文件和目录,包括 dbt_project.yml
文件。
除了支持 dbt 项目外,工作区还提供统一的编辑器供您创建、组织和管理 Snowflake 中多种文件类型和项目的代码。有关更多信息,请参阅 工作区。
了解 dbt 项目对象¶
DBT PROJECT 是一个架构级别的对象,它包含 Snowflake 中 dbt 项目的版本控制源文件。您可以将 dbt 项目对象连接到工作区,也可以独立于工作区创建和管理对象。
您可以像 Snowflake 中的其他架构级对象一样 CREATE、ALTER 和 DROP dbt 项目对象。dbt 项目对象还支持基于角色的访问控制 (RBAC)。您可以从 Snowflake 仓库中使用 EXECUTE DBT PROJECT 命令来运行 dbt 命令(如 test
和 run
)。您也可以使用 任务 来计划这些命令的执行。
dbt 项目对象通常基于包含 dbt-project.yml
文件的 dbt 项目目录。这是当您从工作区中部署(创建)dbt 项目对象时 Snowflake 使用的模式。
您也可以选择从父目录(其子目录包含多个 dbt 项目)创建 dbt 项目。当您以这种方式创建 dbt 项目对象时,必须在与项目结合使用的任何 EXECUTE DBT PROJECT 命令中使用 PROJECT_ROOT 参数。此参数指定包含项目 dbt_project.yml
文件的子目录的路径。
dbt 项目对象的 CI/CD 工作流程¶
dbt 项目对象支持一些可用于从命令行创建和管理 dbt 项目的 Snowflake CLI 命令。这对于将 dbt 项目集成到您的数据工程工作流程和 CI/CD 管道中很有用。有关更多信息,请参阅 Snowflake CLI、将 CI/CD 集成到 Snowflake CLI 中 和 snow dbt 命令。
dbt 项目对象和文件的版本控制¶
Snowflake 维护 dbt 项目对象的版本及其相应的项目文件。您可以在整个数据开发和部署生命周期中使用此版本控制来跟踪和管理更改。Snowflake 通过以下示例所示的方式识别 dbt 项目暂存区中的 dbt 项目对象版本:
snow://dbt/my_db.my_schema.my_dbt_project_object/versions/version_id
version_id
可以是以下任一标识符:
VERSION$<num>
– 以VERSION$<num>
的形式指定版本标识符,其中<num>
is a positive integer, for example,VERSION$1
。当您创建 dbt 项目对象时,版本号从
1
开始,并随着 dbt 项目对象的每个新版本递增一。当您执行以下任务时,Snowflake 会递增版本标识符:
从工作区中 :ui:`Redeploy dbt project`(运行 ALTER 命令)。
通过使用 ALTER DBT PROJECT 命令更新项目。
在不使用
--force
选项的情况下运行 Snow CLIsnow dbt deploy
命令。当您运行以下命令时,Snowflake 会将版本标识符重置为
1
并移除所有版本别名:
在 SQL 中,带
OR REPLACE
选项 CREATE DBT PROJECT 命令。在 Snowflake CLI 中,带
--force
选项的snow dbt deploy
命令。
LAST
– 表示 dbt 项目对象的最新版本。
FIRST
– 表示 dbt 项目对象的最早版本。
version_name_alias
– 表示您已使用带 ADD VERSION 选项的 ALTER DBT PROJECT 命令为特定版本的 dbt 项目对象创建的自定义版本名称别名。版本名称别名始终映射到特定的版本标识符,例如VERSION$3
。
Project files stored in the dbt project stage are organized by version, with each version having its own subdirectory. For example, a dbt project object named my_dbt_project_object
with a version identifier of VERSION$3
and a dbt project file named dbt_project.yml
can be referenced as shown in the following example:
snow://dbt/my_db.my_schema/my_dbt_project_object/versions/VERSION$3/dbt_project.yml
要求、注意事项和限制¶
在使用 dbt Projects on Snowflake 之前,请查看本节中的要求、注意事项和限制。
dbt 项目¶
以下要求、注意事项和限制适用于 dbt Projects on Snowflake 支持的 dbt 项目配置:
仅支持 dbt Core 项目。不支持 dbt Cloud 项目。dbt Projects on Snowflake 运行 dbt-core 版本 1.9.4 和 dbt-snowflake 版本 1.9.2。当您将现有的 dbt 项目迁移到 Snowflake 时,您的 dbt 版本不必与 Snowflake 版本保持一致。
Snowflake 工作区中的每个 dbt 项目文件夹都必须包含一个
profiles.yml
文件,该文件在 Snowflake 中为该项目指定目标warehouse
、database
、schema
和role
。必须将type
设置为snowflake
。dbt 需要一个account
和:code:user
,但这些可以留空或是任意字符串,因为 dbt 项目在 Snowflake 中的当前账户和用户上下文下运行。工作区中的 dbt 项目的文件夹结构中不能包含超过 20,000 个文件。此限制包括 dbt 项目目录和子目录中的所有文件,包括
target/dbt_packages/logs
目录,当从工作区中运行 dbt 项目时,日志文件会保存在这些目录中。
存储过程¶
当您使用存储过程来调用 EXECUTE DBT PROJECT 时,使用调用方权限存储过程。有关更多信息,请参阅 CREATE PROCEDURE 和 创建存储过程。
dbt Projects on Snowflake 的工作区¶
以下要求、注意事项和限制适用于 dbt Projects on Snowflake 的工作区:
个人数据库要求¶
工作区是在个人数据库中创建的,不能与其他用户共享。必须在账户级别启用个人数据库,这需要 ACCOUNTADMIN 权限。有关更多信息,请参阅 管理工作区。
每个项目、每个会话都需要次要角色¶
要从 dbt Projects on Snowflake 的工作区中执行 dbt 命令,必须启用次要角色。如果没有为项目和会话启用次要角色,则在首次执行命令时,系统会提示您启用 Profile 列表中的次要角色。必须为每个项目进行此选择,并且此选择不会持续到当前浏览器会话之后。
如果您有 Enterprise Edition 帐户,则可能会将会话策略配置为不允许该账户或特定用户使用次要角色。这些用户将无法从 dbt Projects on Snowflake 的工作区中执行 dbt 命令。有关会话策略的更多信息,请参阅 在会话策略中指定次要角色。
Git 存储库¶
将 dbt Projects on Snowflake 的工作区连接到 Git 存储库时,以下要求、注意事项和限制适用:
要在 Snowflake 中设置 Git 存储库对象,需在 Snowflake 上设置 API 集成。有关更多信息,请参阅 设置 Snowflake 以使用 Git。
不支持只能通过 PrivateLink 访问的 Git 存储库。
不支持大于 2GB 的 Git 存储库。
不能连接到空的 Git 存储库。必须至少提交一次。
dbt 依赖关系¶
以下要求、注意事项和限制适用于 dbt Projects on Snowflake 中 dbt 项目的 dbt 依赖关系:
必须从 dbt Projects on Snowflake 的工作区中执行 dbt
deps
命令,或者从 Snowflake CLI 中使用snow dbt execute
命令来构建和填充dbt_packages
项目文件夹。您无法使用 EXECUTE DBT PROJECT SQL 命令来执行deps
命令。或者,您可以先在本地 dbt 项目上运行deps
,然后再作为 dbt 项目对象部署到 Snowflake。不支持在
packages.yml
文件中指定 Git 包 (https://docs.getdbt.com/docs/build/packages#git-packages)。要允许 Snowflake 访问依赖关系的存储库,需要网络规则和外部访问集成。有关更多信息,请参阅 在 Snowflake 中为 dbt 依赖关系创建外部访问集成。有关外部网络访问限制的更多信息,请参阅 外部网络访问限制。
遥测、日志记录和跟踪¶
以下要求、注意事项和限制适用于 Snowflake 上针对 dbt 的遥测、日志记录和跟踪:
dbt Projects on Snowflake 的工作区不能动态流式传输标准输出,并且标准输出只能在命令完成时查看。
查看日志和跟踪需要在 dbt 项目对象上设置 LOG_LEVEL 和 TRACE_LEVEL。有关更多信息,请参阅 Snowflake 上 dbt 项目的访问控制 和 在 Snowflake 上监控 dbt 项目。
默认情况下,Snowflake 会在默认 SNOWFLAKE TELEMETRY.EVENTS 表中收集遥测数据。如果您有设置为账户事件表的自定义事件表,则会在那里收集遥测数据。如果您使用 Enterprise Edition 账户,则可以创建事件表来收集遥测数据,并将其与在其中部署 dbt 项目对象的数据库关联。有关更多信息,请参阅 事件表概述。
支持的 dbt 命令¶
下表显示了 dbt Projects on Snowflake 中支持的 dbt 命令。不支持此处未列出的任何 dbt 命令 (https://docs.getdbt.com/reference/dbt-commands)。
dbt Projects on Snowflake,通过执行方法支持 dbt 命令¶ dbt 命令
工作区
EXECUTE DBT PROJECT
snow dbt execute
(CLI)build (https://docs.getdbt.com/reference/commands/build)
✔
✔
✔
compile (https://docs.getdbt.com/reference/commands/compile)
✔
✔
✔
deps (https://docs.getdbt.com/reference/commands/deps)
✔
❌
✔
list (https://docs.getdbt.com/reference/commands/list)
✔
✔
✔
parse (https://docs.getdbt.com/reference/commands/parse)
❌
✔
✔
run (https://docs.getdbt.com/reference/commands/run)
✔
✔
✔
run-operation (https://docs.getdbt.com/reference/commands/run-operation)
✔
✔
✔
seed (https://docs.getdbt.com/reference/commands/seed)
✔
✔
✔
show (https://docs.getdbt.com/reference/commands/show)
✔
✔
✔
snapshot (https://docs.getdbt.com/reference/commands/snapshot)
✔
✔
✔
test (https://docs.getdbt.com/reference/commands/test)
✔
✔
✔