dbt : 実務に役立つ実装パターン集(1)~DWH(3NF)へのSCD Type-2実装
重要:個人情報や機密情報の使用に関する注意喚起(必ずお読みください)
当検証で紹介している技術やサービスの使用は、読者の皆様自身の判断と責任で行ってください。特に、個人情報や機密情報を含むデータの取り扱いについては、最大限の注意を払い、適切なセキュリティ対策を講じることが不可欠です。
検証や実際の利用を行う際には、常にプライバシー保護の法律、規制、およびベストプラクティスを遵守するよう心掛けてください。また、第三者のデータを使用する場合は、必要な同意を得ること、及びそのデータの使用が法律に準じていることを確認することが重要です。
本ブログや筆者、所属する団体は、紹介する技術を用いて行われるいかなる活動から生じる直接的または間接的な損害に対して、責任を負いかねます。技術を使用することによって生じ得るリスクを理解し、自己の責任で慎重にご活用ください。
本投稿に記載されている会社名やクラウド製品名は、各社の登録商標です。
また、投稿内容は投稿日時点のものであり、変更される可能性があります。
ご不明点や懸念がある場合は、クラウドベンダーや専門家に相談することをお勧めします。
当検証の情報を活用することで、読者の皆様が新たな知識やスキルを安全に身に付け、ビジネスでの活用をすすめていただければ幸いです。
近年、データ分析やエンジニアリングの分野で「dbt(Data Build Tool)」が注目を集めています。データの変換プロセスを効率的に管理し、SQLを使ってデータをモデル化できるこのソフトウェアは、ビジネスの迅速な意思決定を支えるデータ基盤構築の現場で急速に浸透しています。dbtは、データチームの作業フローをシンプルかつパワフルにし、多くの企業での導入が進んでいます。
本投稿のシリーズでは、dbtの基本や操作方法の解説は割愛し、すでにdbtを使用している方や活用を始める方向けに、さまざまな状況で役立つ具体的なソリューションを紹介していきます実務で直面する課題に対しての解決策の選択肢をお伝えすることが目的です。
ぜひ、dbtの活用シーンをさらに広げるためのヒントとしてご活用いただければと思います。
今回は、dbtを使ってデータウェアハウスのSCD(Sowly Changing Data)を管理・更新する方法を紹介します。SCDは、インフォメーションマートに使われるのSCD(Sowly Changing Dimension)として、Type-0~7の8種類が存在しますが、今回はその中でもデータウェアハウスでよく利用されるType-2について解説します。Type-0~7の詳細については、こちらをご参照ください。
利用する環境
利用する環境は次の通りです。
用途 | 環境/バージョン |
---|---|
dbt実行環境 | OS:Windows 11 |
Python:3.11.9 | |
dbt Core:1.8.8 | |
dbt bigquery:1.8.3 | |
データベース | GCP BigQuery |
解説で使用するモデル
説明のために利用するモデルは顧客マスタです。DDLと初期データは次の通りです。
- データウェアハウス

- ソースデータ

赤字部分が従来のデータを異なるため、DWHを更新する処理を実行すると、下記の結果となる想定です。
- 期待される結果
- cust_cd=00001は、nameが変更されているので、従来レコードのedtが更新され、新しいレコードが挿入されています。
- cust_cd=00002は、addressが変更されているので、従来レコードのedtが更新され、新しいレコードが挿入されています。
- cust_cd=00003は、何も変更点がないため、従来のレコードが更新されていません。

従来のSQLによるSCD Ttype-2の実装
上記の要件を満たすため、従来のSQLによる更新処理は次のようなコードを開発し実装していました。
dbtによる実装
それでは、dbtを使って上記と同様の実装を行ってみます。
dbtにはこのような要件に対応するためのメカニズムとして、スナップショットという機能が用意されています。
従来のように長いSQLを記述することなく、次のSQLスクリプトを記載することにより、同様の要件を簡単に満たすことが可能です。
ここでは便宜上、ターゲットテーブルをcustomer_history_ssとしています。
SQL(config部分)の記載内容は次のような内容です。
パラメータ | 内容 | 説明 |
---|---|---|
target_schema | dbtdev | dbt がスナップショットテーブルを作成するスキーマ |
strategy | check | 使用するスナップショット戦略(checkかtimestamp) |
unique_key | cust_cd | ビジネスキーのカラム名 |
check_cols | ['name', 'address', 'gender_cd'] | strategy=checkの場合に変更有無を判定するカラム |
updated_at | register_date | 変更基準日となるカラム(公式ドキュメントではstrategy=timestampのときのみ利用) |
このSQLを実行すると、最終的な結果は次の通りとなります。

従来のSQLで実施した結果とデータは一致していますが、次の点が異なります。
- というカラムが自動的に追加されています。 ⇒これはdbtが内部的に使用しているカラムです。このカラムの内容は、のMD5ハッシュ値とのMD5ハッシュ値を結合したものです。
- というカラムが自動的に追加されています。 ⇒これもdbtが内部的に使用しているカラムです。
- 、が意図した名称、と異なります。
これらの差異は、プロジェクト標準と反する場合は、結果をラップするビューをmodels内に定義するなどの対応で対応することが可能となります。
従来の方法と比較して、簡単かつシンプルな実装となるため、生産性の向上や自動化が見込め、データガバナンスやデータ品質の観点でも、より信頼性の高いデータウェアハウスが実現します。
今後も不定期になりますが、dbtを使った実装によるデータ分析基盤のメリットを紹介していきます。