dbt Cloud
dbt(数据编译工具)是一种开发环境,它使数据分析师和数据工程师能够通过编写 select 语句来转换数据。 dbt 可将这些 select 语句转换为表和视图。 dbt 将代码编译为原始 SQL,然后在 Azure Databricks 中的指定数据库上运行该代码。 dbt 支持协作编码模式和最佳做法,例如版本控制、文档和模块化。 有关详细信息,请参阅 dbt 网站上的 What, exactly, is dbt?(dbt 究竟是什么?)和 Analytics Engineering for Everyone: Databricks in dbt Cloud(面向所有人的分析工程:dbt Cloud 中的 Databricks)。
dbt 不会提取或加载数据。 dbt 使用“加载后转换”体系结构,仅专注于转换步骤。 dbt 假定数据库中已有数据的副本。
本文重点介绍 dbt Cloud。 dbt Cloud 为计划作业、CI/CD、提供文档、监视和警报以及集成开发环境 (IDE) 提供统包支持。 有关定价,请参阅 dbt 网站上的 dbt 定价。
也可以使用名为 dbt Core 的 dbt 本地版本。 dbt Core 使你能够在本地开发计算机上选定的文本编辑器或 IDE 中编写 dbt 代码,然后从命令行运行 dbt。 dbt Core 包括 dbt 命令行接口 (CLI)。 dbt CLI 是一个免费的开放源代码工具。 有关详细信息,请参阅 dbt Core。
由于 dbt Cloud 和 dbt Core 可以使用托管的 git 存储库(例如,在 GitHub、GitLab 或 BitBucket 上),因此,你可以使用 dbt Cloud 创建一个 dbt 项目,然后使其可供 dbt Cloud 和 dbt Core 用户使用。 有关详细信息,请参阅 dbt 网站上的创建 dbt 项目和使用现有项目。
有关 dbt 的一般概述,请观看以下 YouTube 视频(26 分钟)。
使用 Partner Connect 连接到 dbt Cloud
在本部分,你将使用 Partner Connect 在 Azure Databricks 工作区中创建新的 Databricks SQL 仓库,然后将新的 SQL 仓库连接到 dbt Cloud。
注意
Partner Connect 不会将 Azure Databricks 群集连接到 dbt Cloud。 若要将群集连接到 dbt Cloud,请转到手动连接到 dbt Cloud。
确保 Azure Databricks 帐户、工作区和已登录用户均满足 Partner Connect 的要求。
在边栏中,单击
“Partner Connect”。单击“dbt”磁贴。
注意
如果“dbt”磁贴内部有一个复选标记图标,这意味着某位管理员已使用 Partner Connect 将 dbt Cloud 连接到你的工作区。 联系该管理员,他可以将你添加到他们使用 Partner Connect 创建的 dbt Cloud 帐户。 在管理员添加你后,单击“dbt”磁贴。
如果“连接到合作伙伴”对话框显示“下一步”按钮,请单击此按钮。
Partner Connect 在工作区中创建以下资源:
- 一个默认名为 DBT_CLOUD_ENDPOINT 的 SQL 仓库。 (可以在单击“下一步”前更改这个默认名称。)
- 名为 DBT_CLOUD_USER 的 Azure Databricks 服务主体。
对于“电子邮件”,请输入你希望 dbt Cloud 用来创建 dbt Cloud 帐户的电子邮件地址,或输入你现有 dbt Cloud 帐户的电子邮件地址。
单击“连接到 dbt Cloud”或“登录”。
重要
如果显示错误提示你组织中的某个人已经使用 dbt Cloud 创建了一个帐户,请联系你组织的一位管理员并让他们将你添加到你组织的 dbt Cloud 帐户。 在管理员将你添加后,再次单击“连接到 dbt Cloud”或“登录”。
如果你单击“连接到 dbt Cloud”,Partner Connect 会创建 Azure Databricks 个人访问令牌并将其与 DBT_CLOUD_USER 服务主体关联。
此时会在 Web 浏览器中打开一个新标签页,其中显示了 dbt Cloud 网站。
按照 dbt Cloud 中的屏幕说明操作以创建 dbt Cloud 帐户,或登录到现有的 dbt Cloud 帐户。 按照这些说明完成操作后,将出现 dbt Cloud 仪表板。
若要浏览 dbt Cloud 项目,请在 dbt 徽标旁边的菜单栏上,从第一个下拉菜单中选择你的 dbt 帐户名称(如果未显示),然后从第二个下拉菜单中选择“Databricks Partner Connect 试用版”项目(如果未显示)。
提示
若要查看项目设置,请单击三条线或汉堡包菜单,单击“帐户设置”>“项目”,然后单击项目名称。 若要查看连接设置,请单击“连接”旁边的链接。 若要更改任何设置,请单击“编辑”。
若要查看此项目的 Azure Databricks 个人访问令牌信息,请单击菜单栏上的人像图标,单击“配置文件”>“凭据”>“Databricks Partner Connect 试用版”,然后单击项目的名称。 若要进行更改,请单击“编辑”。
转到下一部分,向 dbt Cloud 授予对所选数据的读取访问权限。
向 dbt Cloud 授予对数据的读取访问权限
Partner Connect 仅向 DBT_CLOUD_USER 服务主体授予对默认目录的“仅创建”权限。 请在 Azure Databricks 工作区中执行这些步骤,向 DBT_CLOUD_USER 服务主体授予对所选数据的读取访问权限。
警告
可以调整这些步骤,以向 dbt Cloud 授予对工作区中目录、数据库和表的其他访问权限。 但是,作为安全最佳做法,Databricks 强烈建议仅授予对 DBT_CLOUD_USER 服务主体需要使用的单个表的访问权限,并且仅授予对这些表的读取访问权限。
将工作区切换到“SQL”角色。 为此,请在工作区的边栏中,单击 Databricks 徽标
下方的图标,然后选择“SQL”。单击边栏中的
“数据”。在右上角的下拉列表中选择 SQL 仓库 (DBT_CLOUD_ENDPOINT)。

选择要向 dbt Cloud 授予对其的读取访问权限的表:
- 在“数据资源管理器”下,选择包含表的数据库的目录。
- 选择包含你的表的数据库。
- 选择你的表。
提示
如果你的目录、数据库或表未列出,请分别在“选择目录”、“选择数据库”或“筛选表”框中输入名称的任意部分,以缩小列表范围。

单击“权限”。
单击“授予”。
对于“键入以添加多个用户或组”,请选择“DBT_CLOUD_USER”。 这是 Partner Connect 在上一部分为你创建的 Azure Databricks 服务主体。
提示
如果未看到 DBT_CLOUD_USER,请在“键入以添加多个用户或组”框中开始键入
DBT_CLOUD_USER,直到它出现在列表中,然后将它选中。通过选择“SELECT”和“READ_METADATA”仅授予读取访问权限。
单击“确定”。
对要授予 dbt Cloud 读取访问权限的每个附加表重复步骤 4-9。
Partner Connect 故障排除
如果某人在 dbt Cloud 中删除了此帐户的项目,然后你单击“dbt”磁贴,则会出现一条错误消息,指出找不到该项目。 若要解决此问题,请单击“删除连接”,然后从头开始运行此过程,以重新创建连接。
连接到 dbt Cloud
在本部分,你会将 Azure Databricks 工作区中的 Azure Databricks 群集或 Databricks SQL 仓库连接到 dbt Cloud。
注意
若要创建新的 SQL 仓库,再将其快速连接到 dbt Cloud,请改用 Partner Connect。
要求
- 若要连接到 Azure Databricks 群集,需要 Azure Databricks 个人访问令牌或 Azure Active Directory 令牌。
- 若要连接到 SQL 仓库,需要 Azure Databricks 个人访问令牌或 Azure Active Directory 令牌。
步骤 1:注册 dbt Cloud
转到 dbt Cloud - 注册,输入你的电子邮件、姓名和公司信息。 创建密码并单击“创建我的帐户”。
步骤 2:创建 dbt 项目
在此步骤中,你将创建一个 dbt 项目,其中包含一个到 Azure Databricks 群集或 SQL 仓库的连接,一个包含源代码的存储库,以及一个或多个环境(例如测试和生产环境)。
单击三条线或汉堡包菜单,然后单击“帐户设置”。
单击“新建项目”。
单击“开始”。
在“项目设置”页面上的“名称”中,输入项目的唯一名称,然后单击“继续”。
在“设置数据库连接”页面上,单击“Databricks”。
在“名称”中,输入此连接的唯一名称。
根据你要连接到的项,输入以下信息。
群集
- 将“方法”设置为
ODBC。 - 对于“主机名”,输入 Azure Databricks 群集的高级选项 > JDBC/ODBC 选项卡中的“服务器主机名”值。
- 对于“端口”,输入 Azure Databricks 群集的高级选项 > JDBC/ODBC 选项卡中的“端口”值。
- 对于“组织”,输入 Azure Databricks 工作区 URL 中的
?o=和任何其他查询字符串分隔符之间的值。 - 对于“群集”,输入 Azure Databricks 群集的 ID。 这是“HTTP 路径”值(位于 Azure Databricks 群集的高级选项 > JDBC/ODBC 选项卡中)中最后一个正斜杠字符 (
/) 后面的字符串。 例如1234-567890-test123。 - 将“终结点”留空。
- 对于“用户”,输入
token。 - 对于“令牌”,输入 Azure Databricks 个人访问令牌或 Azure Active Directory 令牌的值。
- 对于“架构”,输入你希望 dbt Cloud 在其中创建表和视图的数据库的名称(例如,
default)。 - 单击 “测试连接” 。
- 如果测试成功,请单击“继续”。
有关详细信息,请参阅 dbt 网站上的 [连接到 Databricks ODBC][link-connect-to-databricks-odbc]。
SQL 仓库
- 将“方法”设置为
ODBC。 - 对于“主机名”,输入 SQL 仓库的连接详细信息选项卡中的“服务器主机名”值。
- 对于“端口”,输入 SQL 仓库的连接详细信息选项卡中的“端口”值。
- 对于“组织”,输入 SQL 仓库的连接详细信息选项卡的“服务器主机名”值中
adb-和第一个点 (.) 之间的值。 - 将“群集”留空。
- 对于“终结点”,输入 SQL 仓库的 ID。 这是“HTTP 路径”值(位于 SQL 仓库的连接详细信息选项卡中)中最后一个正斜杠字符 (
/) 后面的字符串。 例如a123456bcde7f890。 - 对于“用户”,输入
token。 - 对于“令牌”,输入 Azure Databricks 个人访问令牌或 Azure Active Directory 令牌的值。
- 对于“架构”,输入你希望 dbt Cloud 在其中创建表和视图的数据库的名称(例如,
default)。 - 单击 “测试连接” 。
- 如果测试成功,请单击“继续”。
有关详细信息,请参阅 dbt 网站上的 [连接到 Databricks ODBC][link-connect-to-databricks-odbc]。
- 将“方法”设置为
提示
若要查看或更改此项目的设置,或完全删除该项目,请单击三条线或汉堡包菜单,单击“帐户设置”>“项目”,然后单击该项目的名称。 若要更改设置,请单击“编辑”。 若要删除项目,请单击“编辑”“删除项目”。
若要查看或更改此项目的 Azure Databricks 个人访问令牌值,请单击“人员”图标,单击“个人资料”“凭据”,然后单击该项目的名称。 若要进行更改,请单击“编辑”。
连接到 Azure Databricks 群集或 Databricks SQL 仓库后,按照屏幕上的说明设置存储库,然后单击“继续”。
设置存储库后,按照屏幕上的说明邀请用户,然后单击“完成”。 或单击“跳过并完成”。
教程
在本部分,你将使用 dbt Cloud 项目来处理一些示例数据。 本部分假设已创建项目并已打开该项目的 dbt Cloud IDE。
步骤 1:创建和运行模型
在此步骤中,你将使用 dbt Cloud IDE 创建并运行模型,即 select 语句。这些语句可根据数据库中的现有数据,在同一数据库中创建新视图(默认行为)或新表。 此过程根据示例数据集 (databricks-datasets) 中的示例 diamonds 表创建模型,如 _ 的“创建表”部分所述。 此过程假定已在工作区的 default 数据库中创建此表。
打开项目后,单击“开始开发”。
提示
如果未显示“开始开发”按钮,请单击三条线或汉堡包菜单中的“开发”。
在“项目”窗格中,单击“初始化项目”。
创建第一个模型:单击 models 文件夹,单击省略号,然后单击“新建文件”。
输入
models/diamonds_four_cs.sql并单击“创建”。在
diamonds_four_cs.sql文件中,输入以下 SQL 语句并单击“保存”。 此语句仅从diamonds表中选择每颗钻石的克拉数、切工、颜色和透明度详细信息。config块指示 dbt 根据此语句在数据库中创建表。{{ config( materialized='table', file_format='delta' ) }}select carat, cut, color, clarity from diamonds提示
有关
merge增量策略等其他config选项,请参阅 dbt 网站上的config(Apache Spark 配置)以及 GitHub 的 dbt-labs/dbt-spark 存储库中merge(用法说明)的“Model Configuration”(模型配置)和“Incremental Models”(增量模型)部分。创建第二个模型:在“项目”窗格中,单击 models 文件夹,单击省略号,然后单击“新建文件”。
输入
models/diamonds_list_colors.sql并单击“创建”。在
diamonds_list_colors.sql文件中,输入以下 SQL 语句并单击“保存”。 此语句从colors表中的diamonds_four_cs列中选择唯一值,按字母顺序依次对结果进行排序。 由于没有config块,此模型将指示 dbt 根据此语句在数据库中创建视图。select distinct color from diamonds_four_cs sort by color asc创建第三个模型:在“项目”窗格中,单击 models 文件夹,单击省略号,然后单击“新建文件”。
输入
models/diamonds_prices.sql并单击“创建”。在
diamonds_prices.sql文件中,输入以下 SQL 语句并单击“保存”。 此语句按颜色计算钻石的平均价格,并按平均价格从高到低对结果进行排序。 此模型指示 dbt 根据此语句在数据库中创建视图。select color, avg(price) as price from diamonds group by color order by price desc运行模型:在“运行”框中,使用前面三个文件的路径运行
dbt run命令。 在default数据库中,dbt 会创建一个名为diamonds_four_cs的表以及两个名为diamonds_list_colors和diamonds_prices的视图。 dbt 从相关的.sql文件名中获取这些视图和表名称。dbt run --model models/diamonds_four_cs.sql models/diamonds_list_colors.sql models/diamonds_prices.sql... ... | 1 of 3 START table model default.diamonds_four_cs.................... [RUN] ... | 1 of 3 OK created table model default.diamonds_four_cs............... [OK ...] ... | 2 of 3 START view model default.diamonds_list_colors................. [RUN] ... | 2 of 3 OK created view model default.diamonds_list_colors............ [OK ...] ... | 3 of 3 START view model default.diamonds_prices...................... [RUN] ... | 3 of 3 OK created view model default.diamonds_prices................. [OK ...] ... | ... | Finished running 1 table model, 2 view models ... Completed successfully Done. PASS=3 WARN=0 ERROR=0 SKIP=0 TOTAL=3运行以下 SQL 代码,列出有关新视图的信息并选择表和视图中的所有行。
如果要连接到群集,可以从附加到群集的笔记本中运行此 SQL 代码,并将 SQL 指定为笔记本的默认语言。 如果要连接到 SQL 仓库,可以从查询运行此 SQL 代码。
SHOW views IN default+-----------+----------------------+-------------+ | namespace | viewName | isTemporary | +===========+======================+=============+ | default | diamonds_list_colors | false | +-----------+----------------------+-------------+ | default | diamonds_prices | false | +-----------+----------------------+-------------+SELECT * FROM diamonds_four_cs+-------+---------+-------+---------+ | carat | cut | color | clarity | +=======+=========+=======+=========+ | 0.23 | Ideal | E | SI2 | +-------+---------+-------+---------+ | 0.21 | Premium | E | SI1 | +-------+---------+-------+---------+ ...SELECT * FROM diamonds_list_colors+-------+ | color | +=======+ | D | +-------+ | E | +-------+ ...SELECT * FROM diamonds_prices+-------+---------+ | color | price | +=======+=========+ | J | 5323.82 | +-------+---------+ | I | 5091.87 | +-------+---------+ ...
步骤 2:创建和运行更复杂的模型
在此步骤中,你将为一组相关数据表创建更复杂的模型。 这些数据表包含有关虚拟的体育联赛的信息,其中三支队伍需要在一个赛季中完成六场比赛。 此过程将创建数据表、创建模型并运行模型。
运行以下 SQL 代码以创建必要的数据表。
如果要连接到群集,可以从附加到群集的笔记本中运行此 SQL 代码,并将 SQL 指定为笔记本的默认语言。 如果要连接到 SQL 仓库,可以从查询运行此 SQL 代码。
本步骤中的表和视图以
zzz_开头,有助于在本示例中识别它们。 对于自己的表和视图,无需遵循此模式。DROP TABLE IF EXISTS zzz_game_opponents; DROP TABLE IF EXISTS zzz_game_scores; DROP TABLE IF EXISTS zzz_games; DROP TABLE IF EXISTS zzz_teams; CREATE TABLE zzz_game_opponents ( game_id INT, home_team_id INT, visitor_team_id INT ) USING DELTA; INSERT INTO zzz_game_opponents VALUES (1, 1, 2); INSERT INTO zzz_game_opponents VALUES (2, 1, 3); INSERT INTO zzz_game_opponents VALUES (3, 2, 1); INSERT INTO zzz_game_opponents VALUES (4, 2, 3); INSERT INTO zzz_game_opponents VALUES (5, 3, 1); INSERT INTO zzz_game_opponents VALUES (6, 3, 2); /* +---------+--------------+-----------------+ | game_id | home_team_id | visitor_team_id | +=========+==============+=================+ | 1 | 1 | 2 | +---------+--------------+-----------------+ | 2 | 1 | 3 | +---------+--------------+-----------------+ | 3 | 2 | 1 | +---------+--------------+-----------------+ | 4 | 2 | 3 | +---------+--------------+-----------------+ | 5 | 3 | 1 | +---------+--------------+-----------------+ | 6 | 3 | 2 | +---------+--------------+-----------------+ */ CREATE TABLE zzz_game_scores ( game_id INT, home_team_score INT, visitor_team_score INT ) USING DELTA; INSERT INTO zzz_game_scores VALUES (1, 4, 2); INSERT INTO zzz_game_scores VALUES (2, 0, 1); INSERT INTO zzz_game_scores VALUES (3, 1, 2); INSERT INTO zzz_game_scores VALUES (4, 3, 2); INSERT INTO zzz_game_scores VALUES (5, 3, 0); INSERT INTO zzz_game_scores VALUES (6, 3, 1); /* +---------+-----------------+--------------------+ | game_id | home_team_score | visitor_team_score | +=========+=================+====================+ | 1 | 4 | 2 | +---------+-----------------+--------------------+ | 2 | 0 | 1 | +---------+-----------------+--------------------+ | 3 | 1 | 2 | +---------+-----------------+--------------------+ | 4 | 3 | 2 | +---------+-----------------+--------------------+ | 5 | 3 | 0 | +---------+-----------------+--------------------+ | 6 | 3 | 1 | +---------+-----------------+--------------------+ */ CREATE TABLE zzz_games ( game_id INT, game_date DATE ) USING DELTA; INSERT INTO zzz_games VALUES (1, '2020-12-12'); INSERT INTO zzz_games VALUES (2, '2021-01-09'); INSERT INTO zzz_games VALUES (3, '2020-12-19'); INSERT INTO zzz_games VALUES (4, '2021-01-16'); INSERT INTO zzz_games VALUES (5, '2021-01-23'); INSERT INTO zzz_games VALUES (6, '2021-02-06'); /* +---------+------------+ | game_id | game_date | +=========+============+ | 1 | 2020-12-12 | +---------+------------+ | 2 | 2021-01-09 | +---------+------------+ | 3 | 2020-12-19 | +---------+------------+ | 4 | 2021-01-16 | +---------+------------+ | 5 | 2021-01-23 | +---------+------------+ | 6 | 2021-02-06 | +---------+------------+ */ CREATE TABLE zzz_teams ( team_id INT, team_city VARCHAR(15) ) USING DELTA; INSERT INTO zzz_teams VALUES (1, "San Francisco"); INSERT INTO zzz_teams VALUES (2, "Seattle"); INSERT INTO zzz_teams VALUES (3, "Amsterdam"); /* +---------+---------------+ | team_id | team_city | +=========+===============+ | 1 | San Francisco | +---------+---------------+ | 2 | Seattle | +---------+---------------+ | 3 | Amsterdam | +---------+---------------+ */创建第一个模型:在“项目”窗格中,单击 models 文件夹,单击省略号,然后单击“新建文件”。
输入
models/zzz_game_details.sql并单击“创建”。在
zzz_game_details.sql文件中,输入以下 SQL 语句并单击“保存”。 此语句会创建一个表,该表提供每场比赛的详细信息,例如队伍名称和分数。config块指示 dbt 根据此语句在数据库中创建表。-- Create a table that provides full details for each game, including -- the game ID, the home and visiting teams' city names and scores, -- the game winner's city name, and the game date.{{ config( materialized='table', file_format='delta' ) }}-- Step 4 of 4: Replace the visitor team IDs with their city names. select game_id, home, t.team_city as visitor, home_score, visitor_score, -- Step 3 of 4: Display the city name for each game's winner. case when home_score > visitor_score then home when visitor_score > home_score then t.team_city end as winner, game_date as date from ( -- Step 2 of 4: Replace the home team IDs with their actual city names. select game_id, t.team_city as home, home_score, visitor_team_id, visitor_score, game_date from ( -- Step 1 of 4: Combine data from various tables (for example, game and team IDs, scores, dates). select g.game_id, go.home_team_id, gs.home_team_score as home_score, go.visitor_team_id, gs.visitor_team_score as visitor_score, g.game_date from zzz_games as g, zzz_game_opponents as go, zzz_game_scores as gs where g.game_id = go.game_id and g.game_id = gs.game_id ) as all_ids, zzz_teams as t where all_ids.home_team_id = t.team_id ) as visitor_ids, zzz_teams as t where visitor_ids.visitor_team_id = t.team_id order by game_date desc创建第二个模型:在“项目”窗格中,单击 models 文件夹,单击省略号,然后单击“新建文件”。
输入
models/zzz_win_loss_records.sql并单击“创建”。在
zzz_win_loss_records.sql文件中,输入以下 SQL 语句并单击“保存”。 此语句会创建一个视图,视图中会列出该赛季队伍的胜负记录。-- Create a view that summarizes the season's win and loss records by team. -- Step 2 of 2: Calculate the number of wins and losses for each team. select winner as team, count(winner) as wins, -- Each team played in 4 games. (4 - count(winner)) as losses from ( -- Step 1 of 2: Determine the winner and loser for each game. select game_id, winner, case when home = winner then visitor else home end as loser from zzz_game_details ) group by winner order by wins desc运行模型:在“运行”框中,使用前面两个文件的路径运行
dbt run命令。 在default数据库(在项目设置中指定)中,dbt 会创建一个名为zzz_game_details的表和一个名为zzz_win_loss_records的视图。 dbt 从相关的.sql文件名中获取这些视图和表名称。dbt run --model models/zzz_game_details.sql models/zzz_win_loss_records.sql... ... | 1 of 2 START table model default.zzz_game_details.................... [RUN] ... | 1 of 2 OK created table model default.zzz_game_details............... [OK ...] ... | 2 of 2 START view model default.zzz_win_loss_records................. [RUN] ... | 2 of 2 OK created view model default.zzz_win_loss_records............ [OK ...] ... | ... | Finished running 1 table model, 1 view model ... Completed successfully Done. PASS=2 WARN=0 ERROR=0 SKIP=0 TOTAL=2运行以下 SQL 代码,列出有关新视图的信息并选择表和视图中的所有行。
如果要连接到群集,可以从附加到群集的笔记本中运行此 SQL 代码,并将 SQL 指定为笔记本的默认语言。 如果要连接到 SQL 仓库,可以从查询运行此 SQL 代码。
SHOW VIEWS FROM default LIKE 'zzz_win_loss_records';+-----------+----------------------+-------------+ | namespace | viewName | isTemporary | +===========+======================+=============+ | default | zzz_win_loss_records | false | +-----------+----------------------+-------------+SELECT * FROM zzz_game_details;+---------+---------------+---------------+------------+---------------+---------------+------------+ | game_id | home | visitor | home_score | visitor_score | winner | date | +=========+===============+===============+============+===============+===============+============+ | 1 | San Francisco | Seattle | 4 | 2 | San Francisco | 2020-12-12 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 2 | San Francisco | Amsterdam | 0 | 1 | Amsterdam | 2021-01-09 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 3 | Seattle | San Francisco | 1 | 2 | San Francisco | 2020-12-19 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 4 | Seattle | Amsterdam | 3 | 2 | Seattle | 2021-01-16 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 5 | Amsterdam | San Francisco | 3 | 0 | Amsterdam | 2021-01-23 | +---------+---------------+---------------+------------+---------------+---------------+------------+ | 6 | Amsterdam | Seattle | 3 | 1 | Amsterdam | 2021-02-06 | +---------+---------------+---------------+------------+---------------+---------------+------------+SELECT * FROM zzz_win_loss_records;+---------------+------+--------+ | team | wins | losses | +===============+======+========+ | Amsterdam | 3 | 1 | +---------------+------+--------+ | San Francisco | 2 | 2 | +---------------+------+--------+ | Seattle | 1 | 3 | +---------------+------+--------+
步骤 3:创建和运行测试
在此步骤中,你将创建测试,这些测试是有关模型的断言。 运行这些测试时,dbt 会告诉你项目中的每个测试是通过还是失败。
有两种类型的测试。 架构测试用 YAML 编写,返回未通过断言的记录数。 当此数字为零时,表示所有记录都通过,因此测试也通过。 数据测试是必须返回零条记录才算通过的特定查询。
创建架构测试:在“项目”窗格中,单击 models 文件夹,单击省略号,然后单击“新建文件”。
输入
models/schema.yml并单击“创建”。在
schema.yml文件中,输入以下内容并单击“保存”。 此文件包含架构测试,用于确定指定的列是否具有唯一值、不为 null、仅具有指定值或具有组合。version: 2 models: - name: zzz_game_details columns: - name: game_id tests: - unique - not_null - name: home tests: - not_null - accepted_values: values: ['Amsterdam', 'San Francisco', 'Seattle'] - name: visitor tests: - not_null - accepted_values: values: ['Amsterdam', 'San Francisco', 'Seattle'] - name: home_score tests: - not_null - name: visitor_score tests: - not_null - name: winner tests: - not_null - accepted_values: values: ['Amsterdam', 'San Francisco', 'Seattle'] - name: date tests: - not_null - name: zzz_win_loss_records columns: - name: team tests: - unique - not_null - relationships: to: ref('zzz_game_details') field: home - name: wins tests: - not_null - name: losses tests: - not_null创建第一个数据测试:在“项目”窗格中,单击 tests 文件夹,单击省略号,然后单击“新建文件”。
输入
tests/zzz_game_details_check_dates.sql并单击“创建”。在
zzz_game_details_check_dates.sql文件中,输入以下 SQL 语句并单击“保存”。 此文件包含一个数据测试,用于确定常规赛季外是否进行了任何比赛。-- This season's games happened between 2020-12-12 and 2021-02-06. -- For this test to pass, this query must return no results. select date from zzz_game_details where date < '2020-12-12' or date > '2021-02-06'创建第二个数据测试:在“项目”窗格中,单击 tests 文件夹,单击省略号,然后单击“新建文件”。
输入
tests/zzz_game_details_check_scores.sql并单击“创建”。在
zzz_game_details_check_scores.sql文件中,输入以下 SQL 语句并单击“保存”。 此文件包含一个数据测试,用于确定是否有任何分数为负或任何比赛为平局。-- This sport allows no negative scores or tie games. -- For this test to pass, this query must return no results. select home_score, visitor_score from zzz_game_details where home_score < 0 or visitor_score < 0 or home_score = visitor_score创建第三个数据测试:在“项目”窗格中,单击 tests 文件夹,单击省略号,然后单击“新建文件”。
输入
tests/zzz_win_loss_records_check_records.sql并单击“创建”。在
zzz_win_loss_records_check_records.sql文件中,输入以下 SQL 语句并单击“保存”。 此文件包含一个数据测试,用于确定任何队伍是否有负数的胜场或败场记录、是否有超过进行比赛数的胜负记录,或者进行的比赛数是否多于允许的比赛数。-- Each team participated in 4 games this season. -- For this test to pass, this query must return no results. select wins, losses from zzz_win_loss_records where wins < 0 or wins > 4 or losses < 0 or losses > 4 or (wins + losses) > 4运行架构测试:在“运行”框中,使用
--schema选项和models/schema.yml文件中两个模型的名称运行dbt test命令,以运行为这些模型指定的测试.dbt test --schema --models zzz_game_details zzz_win_loss_records... ... | 1 of 15 START test accepted_values_zzz_game_details_home__Amsterdam__San_Francisco__Seattle [RUN] ... | 1 of 15 PASS accepted_values_zzz_game_details_home__Amsterdam__San_Francisco__Seattle [PASS ...] ... ... | ... | Finished running 15 tests ... Completed successfully Done. PASS=15 WARN=0 ERROR=0 SKIP=0 TOTAL=15运行数据测试:在“运行”框中,使用
--data选项运行 命令,以在项目的tests目录中运行测试。dbt test --data... ... | 1 of 3 START test zzz_game_details_check_dates....................... [RUN] ... | 1 of 3 PASS zzz_game_details_check_dates............................. [PASS ...] ... ... | ... | Finished running 3 tests ... Completed successfully Done. PASS=3 WARN=0 ERROR=0 SKIP=0 TOTAL=3
步骤 4:清理
可以通过运行以下 SQL 代码来删除为此示例创建的表和视图。
如果要连接到群集,可以从附加到群集的笔记本中运行此 SQL 代码,并将 SQL 指定为笔记本的默认语言。 如果要连接到 SQL 仓库,可以从查询运行此 SQL 代码。
DROP TABLE zzz_game_opponents;
DROP TABLE zzz_game_scores;
DROP TABLE zzz_games;
DROP TABLE zzz_teams;
DROP TABLE zzz_game_details;
DROP VIEW zzz_win_loss_records;
DROP TABLE diamonds;
DROP TABLE diamonds_four_cs;
DROP VIEW diamonds_list_colors;
DROP VIEW diamonds_prices;