dbt の generic test にて、テスト対象のレコードを絞る方法
こんにちは、川田です。今回は dbt の generic test にて、テスト対象とするレコードを絞る方法を紹介します。
環境
- dbt-core
- 1.8.7
動作確認用の DWH として、BigQuery を利用しています。
結論
Data test-specific configurations の where
プロパティを利用します。
イメージです。
seeds:
- name: users
columns:
- name: prefecture
data_tests:
- not_null:
config:
where: created_at >= '2024-01-01' # ここ
dbt | Data test-specific configurations
動作確認
以下の手順で動作を確認します。
-
- dbt seed を利用して、テストに利用するデータを BigQuery にロード
-
- dbt seed 向けの properties ファイルを用意して、dbt test を実行
1. dbt seed を利用して、テストに利用するデータを BigQuery にロード
dbt seed で利用する csv ファイルを、以下の通り作成します。
DBT_PROJECT_ROOT/seeds/users.csv
created_at,name,prefecture
2024-01-01,AAAA,tokyo
2024-02-01,BBBB,
2024-03-01,CCCC,chiba
2024-04-01,DDDD,kanagawa
2024-05-01,EEEE,gunma
2024-06-01,FFFF,tochigi
dbt seed を実行します。
dbt seed --select ./seeds/users.csv
下記のように、users テーブルが作成され、データが登録されています。
2. dbt seed 向けの properties ファイルを用意して、dbt test を実行
dbt seed 向けの properties ファイルを、以下の通り作成します。
DBT_PROJECT_ROOT/seeds/users.yml
version: 2
seeds:
- name: users
config:
enabled: true
tags: ["users"]
columns:
- name: created_at
- name: name
- name: prefecture
data_tests:
- not_null:
name: not_null_users_prefecture_1
config:
enabled: true
tags: ["test_users"]
where: created_at >= '2024-04-01'
- not_null:
name: not_null_users_prefecture_2
config:
enabled: true
tags: ["test_users"]
where: created_at >= '2024-01-01'
dbt | Data test-specific configurations
prefecture
カラム向けに、not_null
の generic test を 2 つ設定しています。
- not_null_users_prefecture_1
where
プロパティで、対象とするレコードをcreated_at
カラムが 2024-04-01 以降のものとする- テストが成功するはず
- not_null_users_prefecture_2
where
プロパティで、対象とするレコードをcreated_at
カラムが 2024-01-01 以降のものとする- テストが失敗するはず
dbt test を実行します。
$ dbt test --select tag:test_users
17:01:32 Running with dbt=1.8.7
17:01:33 Registered adapter: bigquery=1.8.2
17:01:33 Found 1 seed, 2 data tests, 479 macros
17:01:33
17:01:34 Concurrency: 1 threads (target='dev')
17:01:34
17:01:34 1 of 2 START test not_null_users_prefecture_1 .................................. [RUN]
17:01:35 1 of 2 PASS not_null_users_prefecture_1 ........................................ [PASS in 1.25s]
17:01:35 2 of 2 START test not_null_users_prefecture_2 .................................. [RUN]
17:01:36 2 of 2 FAIL 1 not_null_users_prefecture_2 ...................................... [FAIL 1 in 0.92s]
17:01:36
17:01:36 Finished running 2 data tests in 0 hours 0 minutes and 3.00 seconds (3.00s).
17:01:36
17:01:36 Completed with 1 error and 0 warnings:
17:01:36
17:01:36 Failure in test not_null_users_prefecture_2 (seeds/users.yml)
17:01:36 Got 1 result, configured to fail if != 0
17:01:36
17:01:36 compiled code at target/compiled/dbt_bq_sample/seeds/users.yml/not_null_users_prefecture_2.sql
17:01:36
17:01:36 Done. PASS=1 WARN=0 ERROR=1 SKIP=0 TOTAL=2
想定通り、not_null_users_prefecture_2 のテストが失敗しています。
target ディレクトリー配下にある、実行された SQL 文のファイルを確認してみます。
DBT_PROJECT_ROOT/target/compiled/dbt_bq_sample/seeds/users.yml/not_null_users_prefecture_2.sql
select prefecture
from (select * from `xxx`.`sample`.`users` where created_at >= '2024-01-01') dbt_subquery
where prefecture is null
from 句内のサブクエリーで、where プロパティで指定した内容が where 句として利用され、レコードを絞って実行していることが分かります。
有効な情報となれば幸いです。