
dbt Cloudでaudit_helperを使用し2つのテーブルが完全一致するか試してみた
かわばたです。
データエンジニアリングに携わっていると、2つのテーブルを比較したいケースはよくあると思います。
- ライブラリや使用環境のバージョンが上がったとき
- リファクタリングしたとき
- データソースが変わったとき
- 使用環境を変更するとき(Alteryx Workflowsからdbtモデルなど)
上記のように、品質の担保のため比較テストをする場面は多いです。
dbtでは、上記のようなケースに有用なマクロが集約されているaudit_helper
というパッケージがあります。
今回はdbt Cloudでaudit_helper
を使用し2つのテーブルが完全一致するか確認していきます。
検証環境
- dbt Cloudのアカウント
- Snowflakeのアカウント
※dbt CloudはEnterprise版、SnowflakeはトライアルアカウントのEnterprise版で試しています。
注意事項
dbt packages とは、dbt (data build tool) プロジェクトで再利用可能なコードの集まりで、他の人が作成したマクロやテスト、ドキュメントなどを自分のプロジェクトに取り込むことができる仕組みです。
下記ドキュメントのとおり、「パッケージの完全性、操作性、有効性、またはセキュリティを認定または確認していない」とあるので使用する際は社内で利用が問題ないか確認することを推奨します。
【Packageの免責事項】
使用データ
生成AIで作成したダミーデータを使用しています。
ORDER_1とORDER_2でorder_idで2件ずつ異なるレコードを入れております。ORDER_3はORDER_1と同様のデータとなります。
ORDER_1 100行
order_id | user_id | product_id | quantity | order_date | status |
---|---|---|---|---|---|
30011 | 101 | 201 | 5 | 2024-06-01 | completed |
30022 | 102 | 204 | 1 | 2024-06-01 | completed |
3003 | 101 | 205 | 2 | 2024-06-02 | shipped |
3004 | 103 | 202 | 10 | 2024-06-03 | completed |
3005 | 104 | 203 | 3 | 2024-06-05 | shipped |
3006 | 102 | 201 | 2 | 2024-06-05 | pending |
3007 | 105 | 205 | 1 | 2024-06-08 | completed |
3008 | 101 | 204 | 1 | 2024-06-10 | pending |
~~~ | ~~~ | ~~~ | ~~~ | ~~~ | ~~~ |
ORDER_2 100行
order_id | user_id | product_id | quantity | order_date | status |
---|---|---|---|---|---|
3001 | 101 | 201 | 5 | 2024-06-01 | completed |
3002 | 102 | 204 | 1 | 2024-06-01 | completed |
30033 | 101 | 205 | 2 | 2024-06-02 | shipped |
30044 | 103 | 202 | 10 | 2024-06-03 | completed |
3005 | 104 | 203 | 3 | 2024-06-05 | shipped |
3006 | 102 | 201 | 2 | 2024-06-05 | pending |
3007 | 105 | 205 | 1 | 2024-06-08 | completed |
3008 | 101 | 204 | 1 | 2024-06-10 | pending |
~~~ | ~~~ | ~~~ | ~~~ | ~~~ | ~~~ |
ORDER_3 100行
ORDER_1と同様のデータ
audit_helperのインストール
【audit_helperドキュメント】
早速audit_helperをインストールしていきます。
- dbt CloudのStudioで
dbt_project.yml
と同じ場所にpackages.yml
を作成します。
packages.yml
内で、下記のように記述します。
packages:
- package: dbt-labs/audit_helper
version: 0.12.1
- 保存が完了したら、画面最下部のコマンドラインで
dbt deps
コマンドを実行します。
- 成功すると、File explorerに'dbt_packages'が作成され、その中に
audit_helper
がインストールされています。
compare_and_classify_query_results
audit_helperには様々なマクロがありますが、今回は2つのテーブルが完全一致しているか、差分があるのかを判定したいので、compare_and_classify_query_results
を使用します。
使用方法
下記SQLの引数を比較対象のソースorモデルに変更し、モデルを作成します。
先に差分が出るようにORDER_1とORDER_2を比較します。
-- 比較対象Aのクエリ,今回はORDER_1
-- 対象のソースorモデルをfrom句に
-- 比較したいカラムをselect句に
{% set old_query %}
select
order_id ,
user_id ,
product_id ,
quantity ,
order_date ,
status
from {{ source('public', 'ORDER_1') }}
{% endset %}
-- 比較対象Bのクエリ,今回はORDER_2
-- 対象のソースorモデルをfrom句に
-- 比較したいカラムをselect句に
{% set new_query %}
select
order_id ,
user_id ,
product_id ,
quantity ,
order_date ,
status
from {{ source('public', 'ORDER_2') }}
{% endset %}
-- primary_key_columns:比較のためにクエリを結合するために使用される主キー列のリスト
-- columns:比較する 2 つのクエリに存在する列
-- sample_limit:各分類(共通、追加、削除など)ごとに取得するサンプルレコードの上限数。デフォルトは20件です
{{
audit_helper.compare_and_classify_query_results(
old_query,
new_query,
primary_key_columns=['order_id'],
columns=['order_id', 'user_id', 'product_id','quantity', 'order_date', 'status'],
sample_limit = 200
)
}}
モデルを作成後、dbt run
でモデルを実行します。
※今回はモデル名をcompare_and_classify_query_results
としました。
dbt run --select compare_and_classify_query_results
出力結果の確認
モデル実行後、エディタで先ほど実行したモデルを見てみます。
結果としては下記のとおりです。
各カラムが何を示しているか簡単に解説していきます。
カラム | 内容 |
---|---|
dbt_audit_in_a | クエリAとBを比較し、クエリAに存在する場合True ,存在しない場合False |
dbt_audit_in_b | クエリAとBを比較し、クエリBに存在する場合True ,存在しない場合False |
dbt_audit_row_status | どちらにもレコードが存在する場合identical ,Aに存在しBに存在しないremoved ,Bに存在しAに存在しないadded 、主キーが同じでremoved とadded の両方に現れるレコードは、modified |
dbt_audit_num_rows_in_status | dbt_audit_row_status ごとのレコード数 |
dbt_audit_sample_number | dbt_audit_row_status 分類内でレコードに連番付与 |
差分を確認する場合は、dbt_audit_in_a
とdbt_audit_in_b
をfalseで絞るか、dbt_audit_row_status
でidentical
以外を抽出することで確認できます。
下記例となります。差分が出ていることが確認できました。
次に完全一致するケースも確認してみます。
先ほどのモデルのORDER_2をORDER_3に変更します。
※今回はモデル名をcompare_and_classify_query_results_part2として保存しました。
-- 比較対象Aのクエリ,今回はORDER_1
-- 対象のソースorモデルをfrom句に
-- 比較したいカラムをselect句に
{% set old_query %}
select
order_id ,
user_id ,
product_id ,
quantity ,
order_date ,
status
from {{ source('public', 'ORDER_1') }}
{% endset %}
-- 比較対象Bのクエリ,今回はORDER_3
-- 対象のソースorモデルをfrom句に
-- 比較したいカラムをselect句に
{% set new_query %}
select
order_id ,
user_id ,
product_id ,
quantity ,
order_date ,
status
from {{ source('public', 'ORDER_3') }}
{% endset %}
-- primary_key_columns:比較のためにクエリを結合するために使用される主キー列のリスト
-- columns:比較する 2 つのクエリに存在する列
-- sample_limit:各分類(共通、追加、削除など)ごとに取得するサンプルレコードの上限数。デフォルトは20件です
{{
audit_helper.compare_and_classify_query_results(
old_query,
new_query,
primary_key_columns=['order_id'],
columns=['order_id', 'user_id', 'product_id','quantity', 'order_date', 'status'],
sample_limit = 200
)
}}
同様に差分がないか検証します。
select
dbt_audit_row_status,
COUNT(*) AS row_count
from {{ ref("compare_and_classify_query_results_part2") }}
group by dbt_audit_row_status
identical
が100件のみ抽出されたため、完全一致を確認できました!
最後に
いかがでしたでしょうか。
今回は2つのテーブルが完全一致しているかを確認することが目的だったので、compare_and_classify_query_results
を使用しましたが、audit_helper
には他にもマクロが用意されているので状況に応じて利用してみてください。
この記事が何かの参考になれば幸いです!