dbt Cloud に接続する

DBT(データ構築ツール)は、データアナリストやデータエンジニアがSELECTステートメントを記述するだけでデータを変換できる開発環境です。 dbt は、これらの SELECT ステートメントをテーブルとビューに変換する処理を行います。 dbt はコードを生の SQL にコンパイルし、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 Web サイトの「dbt プロジェクトの作成 」および「 既存のプロジェクトの使用 」を参照してください。

dbt の概要については、次の YouTube ビデオ (26 分) をご覧ください。

Partner Connect を使用してdbtクラウドに接続する

このセクションでは、 Partner Connectを使用して Databricks SQLウェアハウスを dbt Cloudに接続し、dbt Cloudにデータへの読み取りアクセス権を付与する方法について説明します。

標準接続とdbtクラウドの違い

Partner Connectを使用して dbt Cloudに接続するには、「 Partner Connectを使用してデータ準備パートナーに接続する」の手順に従います。dbt Cloud接続は、次の点で標準のデータ準備および変換接続とは異なります。

  • サービスプリンシパルと個人用アクセストークンに加えて、 Partner Connect は Cloud by Default という名前の SQLウェアハウス (以前の SQLエンドポイント) を作成します。

接続するステップ

Partner Connectを使用して dbt Cloudに接続するには、次の手順を実行します。

  1. Partner Connectを使用してデータ準備パートナーに接続します

  2. dbt Cloudに接続すると、dbt Cloud ダッシュボードが表示されます。 dbt Cloud プロジェクトを探索するには、メニュー バーの dbt ロゴの横にある最初のドロップダウンから dbt アカウント名を選択し (表示されていない場合)、2 番目のドロップダウン メニューから Databricks Partner Connect 試用版 プロジェクトを選択します (表示されていない場合)。

    ヒント

    プロジェクトの設定を表示するには、「3 ストライプ」または「ハンバーガー」メニューをクリックし、「 アカウント設定」>「プロジェクト」をクリックして、プロジェクトの名前をクリックします。 接続設定を表示するには、[ 接続] の横にあるリンクをクリックします。 設定を変更するには、[ 編集] をクリックします。

    このプロジェクトの Databricks 個人用アクセストークン情報を表示するには、メニュー バーの "人" アイコンをクリックし、[ プロファイル] > [Databricks Partner Connect 試用版>資格情報] をクリックして、プロジェクトの名前をクリックします。 変更するには、[ 編集] をクリックします。

dbt Cloudにデータへの読み取りアクセス権を付与するステップ

Partner Connect は、デフォルト カタログでのみ クラウド サービスプリンシパルに作成専用権限を付与します。 Databricks ワークスペースで次のステップ に従って、選択したデータへの読み取りアクセス権を クラウド サービスプリンシパルに付与します。

警告

これらのステップ を調整して、ワークスペース内のカタログ、データベース、およびテーブルに対する追加のアクセス権を dbt cloud に付与できます。 ただし、セキュリティのベスト プラクティスとして、Databricks では、 クラウド サービスプリンシパルが操作する必要がある個々のテーブルにのみアクセス権を付与し、それらのテーブルへの読み取りアクセス権のみを付与することを強くお勧めします。

  1. カタログ アイコンサイドバーの [カタログ ]をクリックします

  2. 右上のドロップダウン リストで SQLウェアハウス (クラウド) を選択します。

    ウェアハウスの選択
    1. [カタログ エクスプローラー] で、テーブルのデータベースを含むカタログを選択します。

    2. テーブルを含むデータベースを選択します。

    3. テーブルを選択します。

    ヒント

    カタログ、データベース、またはテーブルが一覧に表示されない場合は、[ カタログの選択]、[ データベースの選択]、または [テーブルのフィルター ] ボックスに名前の一部を入力して、一覧を絞り込みます。

    テーブルのフィルター処理
  3. [ アクセス許可] をクリックします。

  4. [ 許可] をクリックします。

  5. [ 複数のユーザーまたはグループを追加するには 種類] で [ クラウド] を選択します。 これは、前のセクションで作成した Databricks サービスプリンシパル Partner Connect 。

    ヒント

    クラウドが表示されない場合は、一覧に表示されるまで [複数のユーザーまたはグループを追加する DBT_CLOUD_USER の種類] ボックスに「」と入力して選択します。

  6. 読み取りアクセス権を付与するには、 SELECTREAD METADATAを選択します。

  7. OK をクリックします。

dbt cloud に読み取りアクセス権を付与する追加のテーブルごとに、ステップ 4 から 9 を繰り返します。

dbt Cloud接続のトラブルシューティング

誰かがこのアカウントの dbt Cloudでプロジェクトを削除し、 dbt タイルをクリックすると、プロジェクトが見つからないことを示すエラー メッセージが表示されます。 これを修正するには、[ 接続の削除] をクリックし、この手順の最初から開始して接続を再度作成します。

dbtクラウドに手動で接続する

このセクションでは、Databricks ワークスペース内の Databricks クラスターまたは Databricks SQLウェアハウスを dbt Cloud に接続する方法について説明します。

重要

Databricks では、SQLウェアハウスに接続することをお勧めします。 Databricks SQL アクセス資格がない場合、または Python モデルを実行する場合は、代わりにクラスターに接続できます。

要件

  • Databricks ワークスペース内のクラスターまたは SQLウェアハウス。

  • クラスターまたは SQLウェアハウスの接続の詳細 (具体的には、 サーバーのホスト名ポートおよび HTTP パス の値)。

  • Databricksの個人アクセストークン。 個人アクセストークンを作成するには、次の手順を実行します。

    1. Databricks ワークスペースで、上部のバーにある Databricks ユーザー名をクリックし、ドロップダウンから[設定]を選択します。

    2. [ 開発者] をクリックします。

    3. [アクセストークン] の横にある [管理] をクリックします。

    4. [ 新しいトークンの生成] をクリックします。

    5. (任意)今後このトークンを識別するのに役立つコメントを入力し、トークンのデフォルトの有効期間である90日を変更します。有効期間のないトークンを作成するには(非推奨)、[有効期間 (日) ] ボックスを空白のままにしてください。

    6. [生成] をクリックします。

    7. 表示されたトークンを安全な場所にコピーし、[完了] をクリックします。

    コピーしたトークンは、必ず安全な場所に保存してください。 コピーしたトークンを他のユーザーと共有しないでください。 コピーしたトークンを紛失した場合、まったく同じトークンを再生成することはできません。 代わりに、この手順を繰り返して新しいトークンを作成する必要があります。 コピーしたトークンを紛失した場合、またはトークンが侵害されたと思われる場合は、アクセストークン ページでトークンの横にあるごみ箱 (取り消し) アイコンをクリックして、ワークスペースからそのトークンをすぐに削除することを強くお勧めします。

    ワークスペースでトークンを作成または使用できない場合は、ワークスペース管理者がトークンを無効にしているか、トークンを作成または使用する権限を付与していない可能性があります。 ワークスペース管理者または次のトピックを参照してください。

    自動化されたツール、システム、スクリプト、アプリを使用して認証する場合のセキュリティのベスト プラクティスとして、Databricks ではOAuth トークンを使用することをお勧めします。

    個人のアクセス トークン認証を使用する場合、 Databricksでは、ワークスペース ユーザーではなく、サービスプリンシパルに属する個人のアクセス トークンを使用することをお勧めします。 サービスプリンシパルのトークンを作成するには、 「サービスプリンシパルのトークンの管理」を参照してください。

  • dbt Cloudを Unity Catalog、dbt バージョン 1.1 以上で管理されるデータに接続するには。

    この記事のステップ は、最新の dbt バージョンを使用する新しい環境を作成します。 既存の環境の dbt バージョンのアップグレードに関する情報については、dbt ドキュメントの「 クラウドでの dbt の最新バージョンへのアップグレード 」を参照してください。

ステップ1:dbtクラウドにサインアップする

dbt Cloud - サインアップ に移動し、Eメール、名前、会社情報を入力します。パスワードを作成し、[ アカウントの作成] をクリックします。

ステップ 2: dbt プロジェクトを作成する

このステップでは、Databricks クラスターまたは SQLウェアハウスへの接続、ソース コードを含むリポジトリ、および 1 つ以上の環境 (テスト環境や運用環境など) を含む dbt プロジェクトを作成します。

  1. dbt Cloudにサインインします

  2. 設定アイコンをクリックし、[ アカウント設定] をクリックします。

  3. [ 新しいプロジェクト] をクリックします。

  4. [ 名前] にプロジェクトの一意な名前を入力し、[ 続行] をクリックします。

  5. [ 接続の選択] で [ Databricks] をクリックし、[ 次へ] をクリックします。

  6. [ 名前] に、この接続の一意の名前を入力します。

  7. [アダプターの選択] で、[Databricks (dbt-databricks)] をクリックします。

    Databricks では、 dbt-spark ではなく、 Unity Catalogをサポートする dbt-databricks を使用することをお勧めします。 デフォルトでは、新しいプロジェクトでは dbt-databricksが使用されます。 既存のプロジェクトを dbt-databricksに移行するには、dbt ドキュメントの「 dbt-spark から dbt-databricks への移行 」を参照してください。

  8. [ 設定] の [サーバー ホスト名] に、要件の サーバー ホスト名の値を入力します。

  9. [HTTP パス] に、要件の HTTP パス値を入力します。

  10. ワークスペースが Unity Catalog対応の場合は、[ オプション設定] に、dbt cloud で使用するカタログの名前を入力します。

  11. [開発資格情報] の [トークン] に、要件から個人用アクセス トークンを入力します。

  12. [スキーマ] に、dbt cloud でテーブルとビューを作成するスキーマの名前を入力します ( defaultなど)。

  13. [ 接続のテスト] をクリックします。

  14. テストが成功したら、[ 次へ] をクリックします。

詳細については、dbt Web サイトの「 Databricks ODBC への接続 」を参照してください。

ヒント

このプロジェクトの設定を表示または変更したり、プロジェクトを完全に削除したりするには、設定アイコンをクリックし、[ アカウント設定] >[プロジェクト] をクリックして、プロジェクトの名前をクリックします。 設定を変更するには、[ 編集] をクリックします。 プロジェクトを削除するには、[ 編集] > [プロジェクトの削除] をクリックします。

このプロジェクトの Databricks 個人用アクセストークンの値を表示または変更するには、"個人" アイコンをクリックし、[ プロファイル] > 資格情報をクリックして、プロジェクトの名前をクリックします。 変更するには、[ 編集] をクリックします。

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
    

    ヒント

    merge 増分戦略などの追加の config オプションについては、dbt ドキュメントの「 Databricks 構成 」を参照してください。

  7. 名前を付けて保存」をクリックします。

  8. ファイル名に「 models/diamonds_four_cs.sql 」と入力し、[ 作成] をクリックします。

  9. 2[新規ファイルの作成] アイコン つ目のモデルを作成する:右上隅にある「( 新規ファイルを作成 )」をクリックします 。

  10. テキスト・エディターで、以下の SQL ステートメントを入力します。 このステートメントは、 diamonds_four_cs テーブルの colors 列から一意の値を選択し、結果をアルファベット順に最初から最後まで並べ替えます。config ブロックがないため、このモデルは、このステートメントに基づいてデータベースにビューを作成するように dbt に指示します。

    select distinct color
    from diamonds_four_cs
    sort by color asc
    
  11. 名前を付けて保存」をクリックします。

  12. ファイル名に「 models/diamonds_list_colors.sql」と入力し、[ 作成] をクリックします。

  13. 3[新規ファイルの作成] アイコン 番目のモデルを作成する:右上隅にある「( 新規ファイルを作成 )」をクリックします 。

  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. モデルの実行: コマンド ラインで、上記の 3 つのファイルへのパスを指定して dbt run コマンドを実行します。 default データベースでは、dbt は diamonds_four_cs という名前のテーブルを 1 つ作成し、 diamonds_list_colorsdiamonds_pricesという名前の 2 つのビューを作成します。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: より複雑なモデルを作成して実行する

このステップでは、関連するデータ テーブルのセットに対して、より複雑なモデルを作成します。 これらのデータ テーブルには、6 試合のシーズンをプレイする 3 つのチームの架空のスポーツ リーグに関する情報が含まれています。 この手順では、データ テーブルを作成し、モデルを作成して、モデルを実行します。

  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. 2[新規ファイルの作成] アイコン つ目のモデルを作成する:右上隅にある「( 新規ファイルを作成 )」をクリックします 。

  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. モデルの実行: コマンド ラインで、前の 2 つのファイルへのパスを指定して dbt run コマンドを実行します。 default データベース (プロジェクト設定で指定) に、dbt は zzz_game_details という名前のテーブルを 1 つ作成し、 zzz_win_loss_recordsという名前のビューを 1 つ作成します。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 はプロジェクト内の各テストが成功したか失敗したかを通知します。

テストには 2 つのタイプがあります。 YAMLで記述されたスキーマテストは、アサーションに合格しないレコードの数を返します。この数値が 0 の場合、すべてのレコードが合格するため、テストに合格します。 データ テスト は、合格するために 0 レコードを返す必要がある特定のクエリです。

  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. 2[新規ファイルの作成] アイコン つ目のデータテストを作成する:右上隅にある「( 新規ファイルを作成 )」をクリックします 。

  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. 3[新規ファイルの作成] アイコン 番目のデータテストを作成する:右上隅にある「( 新規ファイルを作成 )」をクリックします 。

  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 の ベスト プラクティスについて説明します。