连接到 dbt Cloud
dbt(数据编译工具)是一种开发环境,它使数据分析师和数据工程师能够通过编写 select 语句来转换数据。 dbt 可将这些 select 语句转换为表和视图。 dbt 将代码编译为原始 SQL,然后在 Azure Databricks 中的指定数据库上运行该代码。 dbt 支持协作编码模式和最佳做法,例如版本控制、文档和模块化。
dbt 不会提取或加载数据。 dbt 使用“加载后转换”体系结构,仅专注于转换步骤。 dbt 假定数据库中已有数据的副本。
本文重点介绍 dbt Cloud。 dbt Cloud 为计划作业、CI/CD、提供文档、监视和警报以及集成开发环境 (IDE) 提供统包支持。
也可以使用名为 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 Cloud
本部分介绍如何将 Azure Databricks 工作区中的 Azure Databricks 群集或 Databricks SQL 仓库连接到 dbt Cloud。
重要
Databricks 建议连接到 SQL 仓库。 如果没有 Databricks SQL 访问权利,或者想要运行 Python 模型,可以改为连接到群集。
要求
Azure Databricks 工作区中的群集或 SQL 仓库。
群集或 SQL 仓库的连接详细信息,特别是“服务器主机名”、“端口”和“HTTP 路径”值。
Azure Databricks 个人访问令牌或 Microsoft Entra ID(以前称为 Azure Active Directory)令牌…… 若要创建个人访问令牌,请执行以下操作:
- 在 Azure Databricks 工作区中,单击顶部栏中的 Azure Databricks 用户名,然后从下拉列表中选择“设置”。
- 单击“开发人员”。
- 在“访问令牌”旁边,单击“管理”。
- 单击“生成新令牌”。
- (可选)输入有助于将来识别此令牌的注释,并将令牌的默认生存期更改为 90 天。 若要创建没有生存期的令牌(不建议),请将“生存期(天)”框留空(保留空白)。
- 单击“生成” 。
- 将显示的令牌复制到安全位置,然后单击“完成”。
注意
请务必将复制的令牌保存到安全的位置。 请勿与他人共享复制的令牌。 如果丢失了复制的令牌,你将无法重新生成完全相同的令牌, 而必须重复此过程来创建新令牌。 如果丢失了复制的令牌,或者认为令牌已泄露,Databricks 强烈建议通过单击“访问令牌”页上令牌旁边的垃圾桶(撤销)图标立即从工作区中删除该令牌。
如果你无法在工作区中创建或使用令牌,可能是因为工作区管理员已禁用令牌或未授予你创建或使用令牌的权限。 请与工作区管理员联系,或参阅以下主题:
若要将 dbt Cloud 连接到 Unity Catalog 管理的数据,则必须使用 dbt 1.1 或更高版本。
本文中的步骤创建一个使用最新 dbt 版本的新环境。 若要了解如何升级现有环境的 dbt 版本,请参阅 dbt 文档中的升级到云中的最新版 dbt。
步骤 1:注册 dbt Cloud
转到 dbt Cloud - 注册,输入你的电子邮件、姓名和公司信息。 创建密码并单击“创建我的帐户”。
步骤 2:创建 dbt 项目
在此步骤中,你将创建一个 dbt 项目,其中包含一个到 Azure Databricks 群集或 SQL 仓库的连接、一个包含源代码的存储库,以及一个或多个环境(例如测试和生产环境)。
单击设置图标,然后单击“帐户设置”。
单击“新建项目”。
对于“名称”,请输入项目的唯一名称,然后单击“继续”。
对于“选择连接”,请单击“Databricks”,然后单击“下一步”。
在“名称”中,输入此连接的唯一名称。
对于“选择适配器”,请单击“Databricks (dbt-databricks)”。
注意
Databricks 建议使用支持 Unity Catalog 的
dbt-databricks
,而不是dbt-spark
。 默认情况下,新项目使用dbt-databricks
。 若要将现有项目迁移到dbt-databricks
,请参阅 dbt 文档中的从 dbt-spark 迁移到 dbt-databricks。对于“设置”下的“服务器主机名”,请根据要求输入服务器主机名称值。
对于“HTTP 路径”,请根据要求输入 HTTP 路径值。
如果工作区启用了 Unity Catalog,请在“可选设置”下输入供 dbt 云使用的目录的名称。
对于“开发凭据”下的“令牌”,请根据要求输入个人访问令牌或 Microsoft Entra ID 令牌。
对于“架构”,输入你希望 dbt Cloud 在其中创建表和视图的架构的名称(例如,
default
)。单击 “测试连接” 。
如果测试成功,请单击“下一步”。
有关详细信息,请参阅 dbt 网站上的 Connecting to Databricks ODBC(连接到 Databricks ODBC)。
提示
若要查看或更改此项目的设置,或完全删除该项目,请单击设置图标,单击“帐户设置”>“项目”,然后单击该项目的名称。 若要更改设置,请单击“编辑”。 若要删除项目,请单击“编辑”>“删除项目”。
若要查看或更改此项目的 Azure Databricks 个人访问令牌值,请单击“人员”图标,单击“个人资料”>“凭据”,然后单击该项目的名称。 若要进行更改,请单击“编辑”。
连接到 Azure Databricks 群集或 Databricks SQL 仓库后,按照屏幕上的说明设置存储库,然后单击“继续”。
设置存储库后,按照屏幕上的说明邀请用户,然后单击“完成”。 或单击“跳过并完成”。
教程
在本部分,你将使用 dbt Cloud 项目来处理一些示例数据。 本部分假设已创建项目并已打开该项目的 dbt Cloud IDE。
步骤 1:创建并运行模型
在此步骤中,你将使用 dbt Cloud IDE 创建并运行模型,即 select
语句。这些语句可根据数据库中的现有数据,在同一数据库中创建新视图(默认行为)或新表。 此过程根据示例数据集中的示例 diamonds
表创建模型。
使用以下代码创建此表。
DROP TABLE IF EXISTS diamonds;
CREATE TABLE diamonds USING CSV OPTIONS (path "/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv", header "true")
此过程假定已在工作区的 default
数据库中创建此表。
打开项目后,单击 UI 顶部的“开发”。
单击“初始化 dbt 项目”。
单击“提交并同步”,输入提交消息,然后单击“提交”。
单击“创建分支”,输入分支的名称,然后单击“提交”。
创建第一个模型:单击“创建新文件”。
在文本编辑器中,输入以下 SQL 语句。 此语句仅从
diamonds
表中选择每颗钻石的克拉数、切工、颜色和透明度详细信息。config
块指示 dbt 根据此语句在数据库中创建表。{{ config( materialized='table', file_format='delta' ) }}
select carat, cut, color, clarity from diamonds
提示
有关其他
config
选项(例如merge
增量策略),请参阅 dbt 文档中的 Databricks 配置。单击“另存为”。
对于文件名,请输入
models/diamonds_four_cs.sql
,然后单击“创建”。创建第二个模型:单击右上角的(“创建新文件”)。
在文本编辑器中,输入以下 SQL 语句。 此语句从
colors
表中的diamonds_four_cs
列中选择唯一值,按字母顺序依次对结果进行排序。 由于没有config
块,此模型将指示 dbt 根据此语句在数据库中创建视图。select distinct color from diamonds_four_cs sort by color asc
单击“另存为”。
对于文件名,请输入
models/diamonds_list_colors.sql
,然后单击“创建”。创建第三个模型:单击右上角的(“创建新文件”)。
在文本编辑器中,输入以下 SQL 语句。 此语句按颜色计算钻石的平均价格,并按平均价格从高到低对结果进行排序。 此模型指示 dbt 根据此语句在数据库中创建视图。
select color, avg(price) as price from diamonds group by color order by price desc
单击“另存为”。
对于文件名,请输入
models/diamonds_prices.sql
,然后单击“创建”。运行模型:在命令行,使用前面三个文件的路径运行
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); -- Result: -- +---------+--------------+-----------------+ -- | 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); -- Result: -- +---------+-----------------+--------------------+ -- | 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'); -- Result: -- +---------+------------+ -- | 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"); -- Result: -- +---------+---------------+ -- | team_id | team_city | -- +=========+===============+ -- | 1 | San Francisco | -- +---------+---------------+ -- | 2 | Seattle | -- +---------+---------------+ -- | 3 | Amsterdam | -- +---------+---------------+
创建第一个模型:单击(右上角的“新建文件”)。
在文本编辑器中,输入以下 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/zzz_game_details.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
单击“另存为”。
对于文件名,请输入
models/zzz_win_loss_records.sql
,然后单击“创建”。运行模型:在命令行中,运行带有指向上面两个文件的路径的
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 编写,返回未通过断言的记录数。 当此数字为零时,表示所有记录都通过,因此测试也通过。 数据测试是必须返回零条记录才算通过的特定查询。
创建架构测试:单击(右上角的“新建文件”)。
在文本编辑器中,输入以下内容。 此文件包含架构测试,用于确定指定的列是否具有唯一值、不为 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
单击“另存为”。
对于文件名,请输入
models/schema.yml
,然后单击“创建”。创建第一个数据测试:单击右上角的(“创建新文件”)。
在文本编辑器中,输入以下 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/zzz_game_details_check_dates.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/zzz_game_details_check_scores.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
单击“另存为”。
对于文件名,请输入
tests/zzz_win_loss_records_check_records.sql
,然后单击“创建”。运行测试:在命令行中,运行
dbt test
命令。
步骤 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;