dbt Cloud integration with Databricks | Databricks on AWS [2022/1/20時点]の翻訳です。
本記事の内容を実践した結果をこちらにまとめています。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
dbt(data build tool)は、データアナリスト、データエンジニアがシンプルにSELECT文を記述することでデータを変換できるようにする開発環境です。dbtはこれらのSELECT文のテーブル、ビューへの変換を行います。dbtは皆様のコードを生のSQLにコンパイルし、Databricksで指定されたデータベース上でコードを実行します。dbtはコラボレーティブなコーディングパターンと、バージョン管理、ドキュメンテーション、モジュール化といったベストプラクティスをサポートしています。詳細に関しては、dbtのウェブサイトにあるWhat, exactly, is dbt?やAnalytics Engineering for Everyone: Databricks in dbt Cloudを参照ください。
dbtはデータの抽出やロードは行いません。dbtは「ロード後の変換」アーキテクチャを用いており、変換ステップのみにフォーカスしています。dbtは皆様がお使いのデータベースに既にデータのコピーを格納していることを前提とします。
本書では、dbt Cloudと呼ばれるホストされているバージョンのdbtにフォーカスします。dbt Cloudはジョブのスケジューリング、CI/CD、提供ドキュメント、モニタリングとアラート、統合開発環境(IDE)のターンキーサポートと共に提供されています。dbt CloudのDeveloperプランは一人の開発者が自由に利用できます。Enterprise有料プランも利用することができます。詳細に関してはdbtウェブサイトのdbt Pricingを参照ください。
dbt Coreと呼ばれるローカルバージョンのdbtも利用することができます。dbt Coreでは、お好きなテキストエディタ、あるいはIDEでdbtコードを記述し、コマンドラインからdbtを実行することができます。dbt Coreにはdbtのコマンドラインインタフェース(CLI)が含まれています。dbt CLIは無料で利用することができ、オープンソースとなっています。詳細に関してはdbt Core integration with Databricksを参照ください。
dbt Cloudとdbt Coreはホストされたgitリポジトリ(例えば、GitHub、GitLab、BitBucket)を使用することができるので、dbt Cloudでdbtプロジェクトを作成し、dbt Coreのユーザーに公開することが可能です。詳細に関しては、dbtウェブサイトのCreating a dbt projectやUsing an existing projectを参照ください。
dbtの概要については、以下のYouTube動画(26分)を参照ください。
要件
- Databricksクラスターに接続する際には、お使いのワークスペースのDatabricksパーソナルアクセストークンが必要です。
- SQLエンドポイントに接続する際には、Databricksのパーソナルアクセストークンが必要です。
ステップ1: dbt Cloudにサインアップする
dbt Cloud - Signupにアクセスし、メールアドレス、氏名、会社情報を入力します。パスワードを作成し、Create my accountをクリックします。
ステップ2: dbtプロジェクトを作成する
このステップでは、Databricksのクラスター、あるいはSQLエンドポイントへの接続情報、ソースコードを格納するリポジトリ、一つ以上の環境(テスト環境やプロダクション環境など)を含むdbtのプロジェクトを作成します。
-
dbt Cloudにサインインします。
-
ハンバーガーメニューをクリックし、Account Settingsをクリックします。
-
New Projectをクリックします。
-
Beginをクリックします。
-
Project SettingsページのNameにプロジェクト固有の名前を入力し、Continueをクリックします。
-
Set Up a Database ConnectionページではDatabricksをクリックします。
-
Nameには接続固有の名前を入力します。
-
接続先に応じて以下の情報を入力します。
クラスター
-
Methodは
ODBC
のままにします。 - Hostnameには、対象のDatabricksクラスターのAdvanced OptionsのJDBC/ODBCタブのServer Hostnameの値を入力します。
- Portには対象のDatabricksクラスターのAdvanced OptionsのJDBC/ODBCタブのPortの値を入力します。
- Organizationは空のままにしておきます。
-
Clusterには対象のDatabricksクラスターのIDを入力します。これは対象のDatabricksクラスターのAdvanced OptionsのJDBC/ODBCタブのHTTP Pathの最後のスラッシュ文字(
/
)以降の文字列である必要があります。例えば、1234-567890-test123
といったものになります。 - Endpointは空のままにしておきます。
-
Userには
token
と入力します。 - TokenにはDatabricksのパーソナルアクセストークンの値を入力します。
-
Schemaには、dbt Cloudがテーブルやビューを作成するデータベースの名前を入力します。(例えば、
default
) - Test Connectionをクリックします。
- テストが成功したらContinureをクリックします。
SQLエンドポイント
-
Methodは
ODBC
のままにします。 - Hostnameには、対象のSQLエンドポイントのConnection DetailsタブのServer Hostnameの値を入力します。
- Portには、対象のSQLエンドポイントのConnection DetailsタブのPortの値を入力します。
- Organizationは空のままにしておきます。
- Clusterは空のままにしておきます。
-
Endpointには対象のSQLエンドポイントのIDを入力します。これは、対象のSQLエンドポイントのConnection DetailsタブのHTTP Pathの最後のスラッシュ文字(
/
)以降の文字列である必要があります。例えば、a123456bcde7f890
といったものになります。 -
Userには
token
と入力します。 - TokenにはDatabricksのパーソナルアクセストークンの値を入力します。
-
Schemaには、dbt Cloudがテーブルやビューを作成するデータベースの名前を入力します。(例えば、
default
) - Test Connectionをクリックします。
- テストが成功したらContinureをクリックします。
-
Methodは
詳細に関しては、dbtウェブサイトのConnecting to Databricks ODBCを参照ください。
ティップ
このプロジェクトの設定を参照、変更、あるいはプロジェクトを削除するには、ハンバーガーメニューをクリックし、Account Settings > Projectsをクリックし、プロジェクトの名前をクリックします。設定を変更するにはEditをクリックします。プロジェクトを削除するにはEdit > Delete Projectをクリックします。このプロジェクトに設定されたDatabricksパーソナルアクセストークンを参照、編集するには人型アイコンをクリックし、Profile > Credentialsをクリックし、プロジェクト名をクリックします。変更するには、Editをクリックします。
Databricksクラスターに接続した後は、Set Up a Repositoryを行うために画面上の指示に従い、Continueをクリックします。
リポジトリをセットアップした後には、ユーザーを招待するための画面上の指示に従い、Compeleteをクリックします。あるいはSkip & Completeをクリックします。
ステップ3: モデルを作成して実行する
このステップでは、当該データベースに存在するデータに基づいて、データベースに新規ビュー(デフォルト)あるいは新規テーブルを作成するselect
文であるモデルを作成して実行するためにdbt Cloud IDEを使用します。この手順では、データサイエンティストとしてDatabricksを使い始めるのテーブルを作成するで説明されているDatabricksデータセットのサンプルdiamonds
テーブルに基づいてモデルを作成します。この手順では、お使いのワークスペースのdefault
データベースにテーブルが既に作成されているものとします。
-
プロジェクトを開き、Start Developingをクリックします。
ティップ
Start Developingボタンが表示されない場合、ハンバーガーメニューのDevelopをクリックします。 -
Projectペインで、initialize your projectをクリックします。
-
最初のモデルを作成します:modelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
models/diamonds_four_cs.sql
を入力しCreateをクリックします。 -
diamonds_four_cs.sql
ファイルで以下のSQL文を入力しsaveをクリックします。この文はdiamonds
テーブルからそれぞれのダイアモンドのcarat、cut、color、clarityのみを選択します。config
ブロックではdbtに対して、この文に基づいてテーブルをデータベースに作成することを指示します。{{ config( materialized='table', file_format='delta' ) }}
SQLselect carat, cut, color, clarity from diamonds
ティップ
merge
インクリメンタル戦略のような追加のconfig
のオプションについてはdbtウェブサイトのApache Spark configurations、GitHubのdbt-labs/dbt-sparkリポジトリのUsage Notesセクションの「Model Configuration」と「Incremental Models」を参照ください。 -
2番目のモデルを作成します:Projectペインでmodelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
models/diamonds_list_colors.sql
を入力しCreateをクリックします。 -
diamonds_list_colors.sql
ファイルで、以下のSQL文を入力しsaveをクリックします。この文はdiamonds_four_cs
テーブルのcolors
カラムの一意の値を取得し、アルファベットの昇順で並び替えを行います。ここでは、config
ブロックがないので、このモデルはdbtに対してこの文を用いてビューをデータベースに作成するように指示します。SQLselect distinct color from diamonds_four_cs order by color asc
-
3つ目のモデルを作成します:Projectペインでmodelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
models/diamonds_prices.sql
を入力しCreateをクリックします。 -
diamonds_prices.sql
ファイルで、以下のSQL文を入力しsaveをクリックします。この文は色ごとのダイアモンドの平均価格を計算し、平均価格の降順で結果を並び替えます。このモデルはdbtに対してこの文を用いてビューをデータベースに作成するように指示します。SQLselect color, avg(price) as price from diamonds group by color order by price desc
-
モデルを実行します:Runボックスで、上述した3つのファイルのパスを指定して
dbt run
コマンドを実行します。default
データベースでdbtはdiamonds_four_cs
というテーブルとdiamonds_list_colors
、diamonds_prices
という2つのビューを作成します。dbtは関連づけられた.sql
ファイルからビュー名とテーブル名を取得します。Bashdbt run --model models/diamonds_four_cs.sql models/diamonds_list_colors.sql models/diamonds_prices.sql
Console... ... | 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 |
+-------+---------+
...
ステップ4: より複雑なモデルを作成して実行する
このステップでは、関連するデータテーブルのセットに対してより複雑なモデルを作成します。これらのデータテーブルにはシーズンで6試合を3つのチームが競技する架空のスポーツリーグに関する情報が含まれています。この手順ではデータテーブルを作成し、モデルを作成して実行します。
-
必要なデータテーブルを作成するために以下のSQL文を実行します。
クラスターに接続している場合には、ノートブックのデフォルト言語をSQLに指定することで、このSQLコードをクラスターにアタッチしているノートブックから実行することができます。SQLエンドポイントに接続している場合にはクエリーからこのSQLコードを実行することができます。
このステップのテーブル、ビューの名前は、このサンプルの一部であることがわかるように
zzz_
から始まっています。ご自身のテーブル、ビューを作成する際にはこのパターンに従う必要はありません。SQLDROP 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 | +---------+---------------+ */
-
最初のモデルを作成します:Projectペインでmodelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
models/zzz_game_details.sql
を入力しCreateをクリックします。 -
zzz_game_details.sql
ファイルで、以下のSQL文を入力しsaveをクリックします。この文はチーム名やスコアのような試合ごとの詳細情報を提供するテーブルを作成します。config
ブロックはdbtにこの文に基づいてテーブルをデータベースに作成することを指示します。SQL-- 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' ) }}
SQL-- 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
-
2つ目のモデルを作成します:Projectペインでmodelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
models/zzz_win_loss_records.sql
を入力しCreateをクリックします。 -
zzz_win_loss_records.sql
ファイルで、以下のSQL文を入力しsaveをクリックします。この文はシーズンにおけるチームの勝敗記録を一覧するビューを作成します。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
-
モデルを実行します:モデルを実行します:Runボックスで、上述した2つのファイルのパスを指定して
dbt run
コマンドを実行します。(プロジェクトの設定で指定した通り)default
データベースで、dbtはzzz_game_details
というテーブルとzzz_win_loss_records
というビューを作成します。dbtは関連づけられた.sql
ファイルからビュー名とテーブル名を取得します。Bashdbt run --model models/zzz_game_details.sql models/zzz_win_loss_records.sql
Console... ... | 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コードを実行することができます。
SQLSHOW VIEWS FROM default LIKE 'zzz_win_loss_records';
Console+-----------+----------------------+-------------+ | namespace | viewName | isTemporary | +===========+======================+=============+ | default | zzz_win_loss_records | false | +-----------+----------------------+-------------+
SQLSELECT * FROM zzz_game_details;
Console+---------+---------------+---------------+------------+---------------+---------------+------------+ | 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 | +---------+---------------+---------------+------------+---------------+---------------+------------+
SQLSELECT * FROM zzz_win_loss_records;
Console+---------------+------+--------+ | team | wins | losses | +===============+======+========+ | Amsterdam | 3 | 1 | +---------------+------+--------+ | San Francisco | 2 | 2 | +---------------+------+--------+ | Seattle | 1 | 3 | +---------------+------+--------+
ステップ5: テストを作成して実行する
筆者注
2021/2/28時点で筆者が確認したところ、dbt Cloudのdbt test
コマンドは--schema
、--data
オプションを受け付けませんでした。コマンドdbt test
のみでスキーマテスト、データテストが実行されることは確認しています。
このステップでは、モデルに対するアサーションを定義するテストを作成します。これらのテストを実行する際には、皆様のプロジェクトがそれぞれのテストに通過したのか失敗したのかをdbtが教えてくれます。
2種類のテストが存在します。YAMLで記述されるスキーマテストはアサーションに通過しなかったレコード数を返却します。この値がゼロの場合、全てのレコードが通過しており、テストに成功したことになります。データテストは通過するためにはゼロを返却すべき特定のクエリーとなります。
-
スキーマテストを作成します:Projectペインでmodelsフォルダーをクリックし、楕円をクリックしてNew Fileをクリックします。
-
models/schema.yml
を入力しCreateをクリックします。 -
schema.yml
ファイルで以下の内容を入力しsaveをクリックします。このファイルには、特定のカラムに一意の値が含まれているかどうか、非nullかどうか、特定の値のみが含まれるか、あるいはこれらの組み合わせかどうかを判断するスキーマテストが含まれています。YAMLversion: 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
-
最初のデータテストを作成します:Projectペインでmodelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
tests/zzz_game_details_check_dates.sql
を入力しCreateをクリックします。 -
zzz_game_details_check_dates.sql
ファイルでは、以下のSQL文を入力し、saveをクリックします。このファイルには、全ての試合が通常のシーズン外で行われたかどうかを決定するデータテストが含まれています。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'
-
2つ目のデータテストを作成します:Projectペインでmodelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
tests/zzz_game_details_check_scores.sql
を入力しCreateをクリックします。 -
zzz_game_details_check_scores.sql
ファイルで以下のSQL文を入力しsaveをクリックします。このファイルには、全てのスコアが負の値か試合が紐づけられているのかを決定するデータテストが含まれています。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
-
3つ目のデータテストを作成します:Projectペインでmodelsフォルダーをクリックし、
...
をクリックしてNew Fileをクリックします。 -
tests/zzz_win_loss_records_check_records.sql
を入力しCreateをクリックします。 -
zzz_win_loss_records_check_records.sql
ファイルで以下のSQL文を入力しsaveをクリックします。このファイルには、あらゆるチームの勝ち負けの数が負の値か、試合数より多い勝ち試合の数、負け試合の数が存在しないか、あり得る数以上の試合数になっていないのかを決定するデータテストが含まれています。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
-
スキーマテストを実行します:指定するモデルに対してテストを実行するために、Runボックスで
--schema
オプションとmodels/schema.yml
ファイルにある2つのモデルの名称を指定してdbt test
コマンドを実行します。Bashdbt test --schema --models zzz_game_details zzz_win_loss_records
Console... ... | 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
-
データテストを実行します:プロジェクトの
test
ディレクトリにあるテストを実行するために、--data
オプションを指定してdbt test
コマンドをRunsボックスで実行します。Bashdbt test --data
Console... ... | 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
ステップ6: クリーンアップ
以下の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プロジェクトのテスト方法を学ぶ
- dbtプロジェクトにおけるSQLプログラミングを行うためのテンプレート言語であるJinjaの使い方を学ぶ
- dbtベストプラクティスを学ぶ
- dbtのローカルバージョンであるdbt Coreに含まれるdbt CLIを学ぶ
追加のリソース
- dbt Getting Started tutorial
- dbt documentation
- dbt + Databricks Demo
- dbt Discourse community
- dbt blog