dbt Cloudでaudit_helperを使用し2つのテーブルが完全一致するか試してみた

dbt Cloudでaudit_helperを使用し2つのテーブルが完全一致するか試してみた

2025.08.18

かわばたです。

データエンジニアリングに携わっていると、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の免責事項】
https://hub.getdbt.com/disclaimer/

使用データ

生成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ドキュメント】

https://hub.getdbt.com/dbt-labs/audit_helper/latest/

早速audit_helperをインストールしていきます。

  1. dbt CloudのStudioでdbt_project.ymlと同じ場所にpackages.ymlを作成します。
    2025-08-14_16h23_00
  2. packages.yml内で、下記のように記述します。
packages:
  - package: dbt-labs/audit_helper
    version: 0.12.1
  1. 保存が完了したら、画面最下部のコマンドラインでdbt depsコマンドを実行します。
    2025-08-14_16h28_01
  2. 成功すると、File explorerに'dbt_packages'が作成され、その中にaudit_helperがインストールされています。
    2025-08-14_16h29_59

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

2025-08-17_16h14_07

出力結果の確認

モデル実行後、エディタで先ほど実行したモデルを見てみます。
結果としては下記のとおりです。

2025-08-17_17h19_45

各カラムが何を示しているか簡単に解説していきます。

カラム 内容
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、主キーが同じでremovedaddedの両方に現れるレコードは、modified
dbt_audit_num_rows_in_status dbt_audit_row_statusごとのレコード数
dbt_audit_sample_number dbt_audit_row_status分類内でレコードに連番付与

差分を確認する場合は、dbt_audit_in_adbt_audit_in_bをfalseで絞るか、dbt_audit_row_statusidentical以外を抽出することで確認できます。
下記例となります。差分が出ていることが確認できました。

2025-08-17_18h28_56

次に完全一致するケースも確認してみます。
先ほどのモデルの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

2025-08-17_18h46_47

identicalが100件のみ抽出されたため、完全一致を確認できました!

最後に

いかがでしたでしょうか。
今回は2つのテーブルが完全一致しているかを確認することが目的だったので、compare_and_classify_query_resultsを使用しましたが、audit_helperには他にもマクロが用意されているので状況に応じて利用してみてください。
この記事が何かの参考になれば幸いです!

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.