连接到 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 网站上的 Creating a dbt project(创建 dbt 项目)和 Using an existing project(使用现有项目)。

有关 dbt 的一般概述,请观看以下 YouTube 视频(26 分钟)。

使用 Partner Connect 连接到 dbt Cloud

本部分介绍如何使用 Partner Connect 将 Databricks SQL 仓库连接到 dbt Cloud,然后向 dbt Cloud 授予对数据的读取访问权限。

标准连接和 dbt Cloud 之间的区别

若要使用 Partner Connect 连接到 dbt Cloud,请按照使用 Partner Connect 连接到数据准备合作伙伴中的步骤操作。 dbt Cloud 连接在以下方面与标准数据准备和转换连接不同:

  • 除服务主体和个人访问令牌之外,Partner Connect 连接还会默认创建一个名为 DBT_CLOUD_ENDPOINT 的 SQL 仓库(以前称为 SQL 终结点)。

连接步骤

要使用 Partner Connect 连接到 dbt Cloud,请执行以下操作:

  1. 使用 Partner Connect 连接到数据准备合作伙伴

  2. 连接到 dbt Cloud 后,将显示 dbt Cloud 仪表板。 若要浏览 dbt Cloud 项目,请在 dbt 徽标旁边的菜单栏上,从第一个下拉菜单中选择你的 dbt 帐户名称(如果未显示),然后从第二个下拉菜单中选择“Databricks Partner Connect 试用版”项目(如果未显示)。

    提示

    若要查看项目设置,请单击三条线或汉堡包菜单,单击“帐户设置”>“项目”,然后单击项目名称。 若要查看连接设置,请单击“连接”旁边的链接。 若要更改任何设置,请单击“编辑”。

    若要查看此项目的 Azure Databricks 个人访问令牌信息,请单击菜单栏上的人像图标,单击“配置文件”>“凭据”>“Databricks Partner Connect 试用版”,然后单击项目的名称。 若要进行更改,请单击“编辑”。

向 dbt Cloud 授予对你的数据的读取访问权限的步骤

Partner Connect 仅向 DBT_CLOUD_USER 服务主体授予对默认目录的“仅创建”权限。 请在 Azure Databricks 工作区中执行这些步骤,向 DBT_CLOUD_USER 服务主体授予对所选数据的读取访问权限。

警告

可以调整这些步骤,以向 dbt Cloud 授予对工作区中目录、数据库和表的其他访问权限。 但是,作为安全最佳做法,Databricks 强烈建议仅授予对 DBT_CLOUD_USER 服务主体需要使用的单个表的访问权限,并且仅授予对这些表的读取访问权限。

  1. 单击边栏中的 目录图标“目录”。

  2. 在右上角的下拉列表中选择 SQL 仓库 (DBT_CLOUD_ENDPOINT)。

    选择仓库

    1. 在“目录资源管理器”下,选择包含表的数据库的目录。
    2. 选择包含你的表的数据库。
    3. 选择你的表。

    提示

    如果你的目录、数据库或表未列出,请分别在“选择目录”、“选择数据库”或“筛选表”框中输入名称的任意部分,以缩小列表范围。

    筛选表

  3. 单击“权限”。

  4. 单击“授予”

  5. 对于“键入以添加多个用户或组”,请选择“DBT_CLOUD_USER”。 这是 Partner Connect 在上一部分为你创建的 Azure Databricks 服务主体。

    提示

    如果未看到 DBT_CLOUD_USER,请在“键入以添加多个用户或组”框中开始键入 DBT_CLOUD_USER,直到它出现在列表中,然后将它选中。

  6. 通过选择 SELECTREAD METADATA 仅授予读取访问权限。

  7. 单击“确定”。

对要授予 dbt Cloud 读取访问权限的每个附加表重复步骤 4-9。

排查 dbt Cloud 连接问题

如果某人在 dbt Cloud 中删除了此帐户的项目,然后你单击“dbt”磁贴,则会出现一条错误消息,指出找不到该项目。 若要解决此问题,请单击“删除连接”,然后从头开始运行此过程,以重新创建连接。

手动连接到 dbt Cloud

本部分介绍如何将 Azure Databricks 工作区中的 Azure Databricks 群集或 Databricks SQL 仓库连接到 dbt Cloud。

重要

Databricks 建议连接到 SQL 仓库。 如果没有 Databricks SQL 访问权利,或者想要运行 Python 模型,可以改为连接到群集。

要求

步骤 1:注册 dbt Cloud

转到 dbt Cloud - 注册,输入你的电子邮件、姓名和公司信息。 创建密码并单击“创建我的帐户”。

步骤 2:创建 dbt 项目

在此步骤中,你将创建一个 dbt 项目,其中包含一个到 Azure Databricks 群集或 SQL 仓库的连接、一个包含源代码的存储库,以及一个或多个环境(例如测试和生产环境)。

  1. 登录到 dbt Cloud

  2. 单击设置图标,然后单击“帐户设置”。

  3. 单击“新建项目”

  4. 对于“名称”,请输入项目的唯一名称,然后单击“继续”。

  5. 对于“选择连接”,请单击“Databricks”,然后单击“下一步”。

  6. 在“名称”中,输入此连接的唯一名称。

  7. 对于“选择适配器”,请单击“Databricks (dbt-databricks)”。

    注意

    Databricks 建议使用支持 Unity Catalog 的dbt-databricks,而不是 dbt-spark。 默认情况下,新项目使用 dbt-databricks。 若要将现有项目迁移到 dbt-databricks,请参阅 dbt 文档中的从 dbt-spark 迁移到 dbt-databricks

  8. 对于“设置”下的“服务器主机名”,请根据要求输入服务器主机名称值。

  9. 对于“HTTP 路径”,请根据要求输入 HTTP 路径值。

  10. 如果工作区启用了 Unity Catalog,请在“可选设置”下输入供 dbt 云使用的目录的名称。

  11. 对于“开发凭据”下的“令牌”,请根据要求输入个人访问令牌或 Microsoft Entra ID 令牌。

  12. 对于“架构”,输入你希望 dbt Cloud 在其中创建表和视图的架构的名称(例如,default)。

  13. 单击 “测试连接”

  14. 如果测试成功,请单击“下一步”。

有关详细信息,请参阅 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 数据库中创建此表。

  1. 打开项目后,单击 UI 顶部的“开发”。

  2. 单击“初始化 dbt 项目”。

  3. 单击“提交并同步”,输入提交消息,然后单击“提交”。

  4. 单击“创建分支”,输入分支的名称,然后单击“提交”。

  5. 创建第一个模型:单击“创建新文件”。

  6. 在文本编辑器中,输入以下 SQL 语句。 此语句仅从 diamonds 表中选择每颗钻石的克拉数、切工、颜色和透明度详细信息。 config 块指示 dbt 根据此语句在数据库中创建表。

    {{ config(
      materialized='table',
      file_format='delta'
    ) }}
    
    select carat, cut, color, clarity
    from diamonds
    

    提示

    有关其他 config 选项(例如 merge 增量策略),请参阅 dbt 文档中的 Databricks 配置

  7. 单击“另存为”。

  8. 对于文件名,请输入 models/diamonds_four_cs.sql,然后单击“创建”。

  9. 创建第二个模型:单击右上角的“创建新文件图标”(“创建新文件”)。

  10. 在文本编辑器中,输入以下 SQL 语句。 此语句从 colors 表中的 diamonds_four_cs 列中选择唯一值,按字母顺序依次对结果进行排序。 由于没有 config 块,此模型将指示 dbt 根据此语句在数据库中创建视图。

    select distinct color
    from diamonds_four_cs
    sort by color asc
    
  11. 单击“另存为”。

  12. 对于文件名,请输入 models/diamonds_list_colors.sql,然后单击“创建”。

  13. 创建第三个模型:单击右上角的“创建新文件图标”(“创建新文件”)。

  14. 在文本编辑器中,输入以下 SQL 语句。 此语句按颜色计算钻石的平均价格,并按平均价格从高到低对结果进行排序。 此模型指示 dbt 根据此语句在数据库中创建视图。

    select color, avg(price) as price
    from diamonds
    group by color
    order by price desc
    
  15. 单击“另存为”。

  16. 对于文件名,请输入 models/diamonds_prices.sql,然后单击“创建”。

  17. 运行模型:在命令行,使用前面三个文件的路径运行 dbt run 命令。 在 default 数据库中,dbt 会创建一个名为 diamonds_four_cs 的表以及两个名为 diamonds_list_colorsdiamonds_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
    
  18. 运行以下 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:创建并运行更复杂的模型

在此步骤中,你将为一组相关数据表创建更复杂的模型。 这些数据表包含有关虚拟的体育联赛的信息,其中三支队伍需要在一个赛季中完成六场比赛。 此过程将创建数据表、创建模型并运行模型。

  1. 运行以下 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     |
    -- +---------+---------------+
    
  2. 创建第一个模型:单击“创建新文件图标”(右上角的“新建文件”)。

  3. 在文本编辑器中,输入以下 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
    
  4. 单击“另存为”。

  5. 对于文件名,请输入 models/zzz_game_details.sql,然后单击“创建”。

  6. 创建第二个模型:单击右上角的“创建新文件图标”(“创建新文件”)。

  7. 在文本编辑器中,输入以下 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
    
  8. 单击“另存为”。

  9. 对于文件名,请输入 models/zzz_win_loss_records.sql,然后单击“创建”。

  10. 运行模型:在命令行中,运行带有指向上面两个文件的路径的 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
    
  11. 运行以下 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 编写,返回未通过断言的记录数。 当此数字为零时,表示所有记录都通过,因此测试也通过。 数据测试是必须返回零条记录才算通过的特定查询。

  1. 创建架构测试:单击“新建文件”图标(右上角的“新建文件”)。

  2. 在文本编辑器中,输入以下内容。 此文件包含架构测试,用于确定指定的列是否具有唯一值、不为 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
    
  3. 单击“另存为”。

  4. 对于文件名,请输入 models/schema.yml,然后单击“创建”。

  5. 创建第一个数据测试:单击右上角的“创建新文件图标”(“创建新文件”)。

  6. 在文本编辑器中,输入以下 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'
    
  7. 单击“另存为”。

  8. 对于文件名,请输入 tests/zzz_game_details_check_dates.sql,然后单击“创建”。

  9. 创建第二个数据测试:单击右上角的“创建新文件图标”(“创建新文件”)。

  10. 在文本编辑器中,输入以下 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
    
  11. 单击“另存为”。

  12. 对于文件名,请输入 tests/zzz_game_details_check_scores.sql,然后单击“创建”。

  13. 创建第三个数据测试:单击右上角的“创建新文件图标”(“创建新文件”)。

  14. 在文本编辑器中,输入以下 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
    
  15. 单击“另存为”。

  16. 对于文件名,请输入 tests/zzz_win_loss_records_check_records.sql,然后单击“创建”。

  17. 运行测试:在命令行中,运行 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;

后续步骤

  • 详细了解 dbt 模型
  • 了解如何测试 dbt 项目。
  • 了解如何使用 Jinja(一种模板化语言)在 dbt 项目中进行 SQL 编程。
  • 了解 dbt 最佳做法

其他资源