Mímisbrunnr知恵の泉

← データエンジニアリング 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:ETLとELTデータ品質とテスト | 関連:メダリオンアーキテクチャワークフローオーケストレーション

要点(BLUF)

概念 ── 変換を「SELECTの宣言」にする

従来、変換は手続き的なスクリプトに散らばりがちでした。dbtは発想を変え、「最終的に欲しいテーブルを定義するSELECT文」を書くだけにします。どう作るか(CREATE TABLE、依存順)はdbtが受け持つ。あなたは「何が欲しいか」をSQLで宣言します。これは SQLの基礎(結合・集約・サブクエリ) の宣言的思想の延長です。

仕組み ── モデル・参照・DAG

flowchart LR
    SRC["source(生データ)"] --> STG["staging(型整え・命名統一)"]
    STG --> INT["intermediate(結合・整形)"]
    INT --> MART["mart(提供用の集計)"]

各段が ref() で前段を参照します(疑似コード):

-- models/mart_active_customers.sql
SELECT cust_id, MIN(email) AS email
FROM {{ ref('stg_customers') }}
WHERE status = 'active' AND email IS NOT NULL
GROUP BY cust_id

ref('stg_customers') がモデル間の辺になり、dbtは依存DAGを作ってstaging → intermediate → mart の順に実行します。手で実行順を管理する必要はありません(→ ワークフローオーケストレーション のDAGと同じ発想)。

ラボでは、この「変換モデルをテーブル化し、一意性テストを通す」流れをSQLiteで再現しました。

実行結果(実機・SQLite):

mart_active_customers: [(1, 'a@x.com'), (2, 'b@x.com')]
一意性テスト(cust_id): 重複 0 件 -> PASS

汚れた元データ(重複・NULL・想定外status)から、active顧客だけの整形済みマートを作り、**一意性テストが0件失敗(PASS)**を返す——変換と検証がセットで回ります。

設計の勘所 ── dbtが付けてくれるもの

機能中身効果
ref()依存解決モデル間の参照からDAG生成実行順を自動化
テストunique/not_null/accepted_values等を宣言品質を変換に内蔵(→ データ品質とテスト
ドキュメント/リネージモデルの説明と依存グラフを自動生成どの数字がどこ由来か追える
マテリアライズ戦略view / table / incremental鮮度とコストの調整
環境分離dev/prod を同じコードで安全に検証してから本番

incrementalマテリアライズは、データ取り込み(バッチ・CDC) の増分とべき等性と再実行 の冪等を組み合わせ、「差分だけ・再実行安全に」変換を更新します。

なぜそうするか ── 変換にエンジニアリングを持ち込む

なぜSQLスクリプトでなくdbtなのか。**変換をコードとして扱える(バージョン管理・レビュー・テスト・再現)**からです。「誰かのSQL」が散在する状態では、数字の出所が追えず、壊れても気づけない。dbtは変換をGit管理のモデルにし、依存を明示し、テストとドキュメントを強制することで、変換層を“信頼できるソフトウェア”に変えます。アナリティクスエンジニアという役割(→ データエンジニアリングとは・役割)が成立したのも、この道具立てのおかげです。

⚠️ よくある落とし穴

対応ラボ

data-engineering-study/labs/04_etl_pipeline.pyPYTHONIOENCODING=utf-8 で実行・変換モデルのテーブル化と一意性テストPASSを確認済み)。

関連

第4章 ETLとデータパイプライン 目次