dbt の generic test にて、テスト対象のレコードを絞る方法

dbt の generic test にて、テスト対象のレコードを絞る方法

Clock Icon2024.10.10

こんにちは、川田です。今回は 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

動作確認

以下の手順で動作を確認します。

    1. dbt seed を利用して、テストに利用するデータを BigQuery にロード
    1. 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 テーブルが作成され、データが登録されています。

bq-table-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 句として利用され、レコードを絞って実行していることが分かります。


有効な情報となれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.