dbt(data build tool)とは、SELECT文だけでデータ変換パイプラインを構築し、テスト・ドキュメント・依存関係管理までを一体で扱えるオープンソースのツールです。ELTアーキテクチャの「T(Transform)」を担う役割として、SnowflakeやBigQueryといったクラウドDWHと組み合わせて利用するのが定番の構成となっています。本記事では、dbtの基本機能、仕組み、モデル定義の書き方、そして最初のプロジェクトを立ち上げるまでの5ステップを、実際のSQL・YAML・コマンド例を交えながら解説します。読み終える頃には「なぜいまdbtがデータ変換のデファクトスタンダードと呼ばれるのか」が、腑に落ちるはずです。

dbtとは何か――「SQLだけでデータ変換パイプラインを構築する」ツール

dbt(data build tool)は、SELECT文を書くだけでDWH内部にテーブルやビューを生成し、そのテーブルに対してテスト・ドキュメント・依存関係管理を同時に行えるオープンソースのデータ変換ツールです。開発元は米Fishtown Analytics社(現dbt Labs社)で、2016年頃から本格的に広まりました。

dbtは、現代のELTアーキテクチャにおける「T(Transform)」の層を担います。Fivetranやcustom ingestion scriptでDWHにデータが取り込まれた後、dbtがその生データをクリーニング・結合・集計してビジネス利用可能な分析テーブルを作る、という分業です。

「Python等の汎用言語ではなく、なぜSQLなのか」という問いに対するdbtの回答は明快です。第一に、SQLはアナリストからエンジニアまで広く使える共通言語だからです。第二に、DWH側でクエリを実行するため処理性能を最大化できるからです。第三に、バージョン管理・コードレビュー・CI/CDといったソフトウェアエンジニアリングの作法を、SQLの世界にそのまま持ち込めるからです。結果としてdbtは「データ変換の民主化」を実現するツールとして広く採用されるに至りました。

dbtでできること5つ

dbtの価値は、単なるSQL実行ツールにとどまらず、データ変換に必要な周辺機能を一体化した点にあります。ここでは中心となる5つの機能を整理します。

1. モデル定義:SELECT文を1ファイル1モデルとして書くだけで、dbtがそれをビューまたはテーブルとしてDWH上に実体化します。CREATE TABLE文を書く必要はありません。モデル間のref()関数による参照が、そのまま依存関係の定義になります。

2. テスト:not_null、unique、accepted_values、relationshipsなどの組み込みテストをYAMLで宣言するだけで、データ品質の自動チェックが走ります。カスタムテストもSQLで記述可能です。

3. ドキュメント:schema.ymlにカラム説明を書くと、dbt docs generateコマンドで静的サイト形式のドキュメントが自動生成されます。リネージグラフも含まれるため、データの流れを視覚的に追えます。

4. リネージ:ref()関数の呼び出し関係からDAG(有向非巡回グラフ)を自動生成し、モデル間の依存を可視化します。影響範囲の調査や並列実行の最適化に役立ちます。

5. スナップショット:SCD Type 2(Slowly Changing Dimension Type 2)を自動実装します。dbt snapshotコマンド1つで、履歴テーブルの更新が完結します。

機能概要対応コマンドユースケース
モデル定義SELECT文でテーブル/ビューを定義dbt run生データから分析用テーブルへの変換全般
テストnot_null、unique等のデータ品質チェックdbt test主キー一意性、外部キー整合性の検証
ドキュメントカラム説明とリネージの自動生成dbt docs generateデータカタログとしての共有
リネージモデル間の依存関係の可視化dbt run –select影響範囲調査、障害時の上流特定
スナップショットSCD Type 2による履歴管理dbt snapshot顧客ステータス履歴、商品マスタの変更追跡

dbtの基本的な仕組み

dbtの処理フローは驚くほどシンプルです。開発者はSQLファイルを書き、dbt runコマンドを実行するだけで、あとはdbtがSQLをコンパイルし、DWHに対して正しい順序で実行してくれます。

【dbtのワークフロー】

[SQLファイル作成] --> [dbt run] --> [コンパイル: Jinja展開]
                                         |
                                         v
[DWH上でSELECT実行] <-- [依存関係順に実行制御]
          |
          v
[テーブル/ビュー生成] --> [dbt test] --> [データ品質検証]

※ dbt本体はメタデータ管理とSQL生成に専念し、重い計算はDWH側で実行する

プロジェクトのディレクトリ構造も明快です。modelsフォルダにSQLファイル、testsにカスタムテスト、macrosにJinjaマクロ、snapshotsにSCD定義、そしてdbt_project.ymlに設定を置きます。この規約によって、どのdbtプロジェクトを見ても「どこに何があるか」がすぐに把握できます。

my_dbt_project/
├── dbt_project.yml
├── models/
│   ├── staging/
│   ├── intermediate/
│   └── marts/
├── tests/
├── macros/
└── snapshots/

dbtのモデル定義――SELECT文だけでテーブルを作る

dbtプロジェクトでは、モデルを「staging」「intermediate」「marts」の3層に分ける設計が定番です。各層の役割を段階的に見ていきましょう。

stagingモデルは、ソーステーブルの型変換・カラム名統一・NULL処理などのクリーニングに特化します。1:1でソースと対応させるのが原則です。

-- models/staging/stg_orders.sql
select
    id as order_id,
    user_id as customer_id,
    order_date::date as ordered_at,
    status,
    amount::numeric(10,2) as amount_jpy
from {{ source('raw', 'orders') }}
where status != 'cancelled'

intermediateモデルは、stagingモデルを組み合わせて中間的なビジネスロジックを実装します。複数テーブルの結合や再利用される計算をここに集約します。

martsモデルは、BIツールから参照される最終的な分析テーブルです。JOIN・集計・ディメンション付与など、ビジネス利用を前提とした構造に整えます。

-- models/marts/fct_customer_orders.sql
select
    c.customer_id,
    c.customer_name,
    count(o.order_id) as order_count,
    sum(o.amount_jpy) as total_amount
from {{ ref('stg_customers') }} c
left join {{ ref('stg_orders') }} o
  on c.customer_id = o.customer_id
group by 1, 2

さらにschema.ymlを書けば、カラムの説明とテストを同じ場所で宣言できます。dbtが最も高く評価される理由の1つが、この「変換コードとテスト・ドキュメントの近接配置」にあります。

version: 2
models:
  - name: fct_customer_orders
    description: "顧客単位の注文サマリ"
    columns:
      - name: customer_id
        description: "顧客の一意識別子"
        tests:
          - not_null
          - unique
      - name: total_amount
        description: "当該顧客の合計購入金額(円)"
        tests:
          - not_null

dbtの始め方――5ステップでHello World

dbtは比較的学習コストが低いツールです。DWHアカウントとローカルのPython環境さえあれば、30分もあれば最初のモデルを実行できます。以下の5ステップで手を動かしてみましょう。

ステップ1:インストール。dbtはアダプタ方式を採っているため、利用するDWHに対応するパッケージを入れます。Snowflakeならpip install dbt-snowflake、BigQueryならpip install dbt-bigqueryです。

ステップ2:プロジェクト初期化。dbt initコマンドを実行すると対話的にプロジェクト名と接続先を尋ねてくれます。

ステップ3:profiles.yml設定。~/.dbt/profiles.ymlにDWHの認証情報を記述します。環境ごとにdev/prodを分けられます。

my_project:
  target: dev
  outputs:
    dev:
      type: snowflake
      account: xxxxx.ap-northeast-1.aws
      user: my_user
      password: "{{ env_var('DBT_PASSWORD') }}"
      database: ANALYTICS_DEV
      schema: dbt_my_user
      warehouse: TRANSFORM_WH

ステップ4:最初のモデル作成。models/example/my_first_model.sqlに簡単なSELECT文を書きます。

ステップ5:実行とドキュメント生成。以下の3コマンドで、モデル実行、テスト、ドキュメント生成を順に走らせます。

dbt run
dbt test
dbt docs generate
dbt docs serve

最後のdbt docs serveでローカルにドキュメントサイトが立ち上がり、リネージグラフを視覚的に確認できます。

dbt Core vs dbt Cloud

dbtには「dbt Core」と「dbt Cloud」という2つの利用形態があります。前者はCLIで動くOSS本体、後者はスケジューラとWeb IDEを備えたSaaSです。dbt自体の機能は共通で、違いは運用体験とインフラの担い手にあります。詳細な比較は別記事で扱いますが、ここでは最低限の対比を押さえておきましょう。

項目dbt Coredbt Cloud
実行環境自前のサーバー・CI/CDマネージドな実行環境
Web IDEなし(ローカル開発)あり(ブラウザ完結)
スケジューリングAirflow等が別途必要組み込みジョブスケジューラ
CI/CDGitHub Actions等を自作組み込みCI機能
料金完全無料Developer無料/Team $100/シート〜

まとめ――dbtは「データ変換の民主化」を実現するツール

本記事の要点を振り返ります。

  • dbtはSELECT文だけでデータ変換を定義するOSS。ELTの「T」を担う
  • モデル・テスト・ドキュメント・リネージ・スナップショットが一体化
  • staging → intermediate → martsの3層構造がベストプラクティス
  • pip installからdbt runまで30分で最初の実行が可能
  • Coreは無料、Cloudは運用体験を買うSaaS。まずCoreから始めるのも有効

次に読むべき記事は、dbt Core vs Cloudの詳細比較、3層アーキテクチャの設計指針、そして品質テスト自動化の実践編です。DE-STKでは、dbtを軸としたデータ変換基盤の設計・実装から、組織への展開支援までを一貫して行っています。導入の相談は専門家へぜひお気軽にどうぞ。

よくある質問(FAQ)

Q. dbtとは何ですか?

A. dbt(data build tool)は、SELECT文でデータ変換を定義し、テスト・ドキュメント・リネージを一体管理するオープンソースのデータ変換ツールです。ELTアーキテクチャの「T(Transform)」を担います。

Q. dbtを使うのにPythonのスキルは必要ですか?

A. 基本的な利用にはSQLの知識だけで十分です。高度なカスタマイズ(マクロ・カスタムテスト)にはJinja2テンプレートの知識があると便利ですが、Python自体は不要です。

Q. dbtはどのDWHに対応していますか?

A. Snowflake、BigQuery、Redshift、Databricks、PostgreSQLなど主要なDWH/データベースに対応しています。アダプタ方式で拡張でき、コミュニティ製アダプタも多数あります。