Mímisbrunnr知恵の泉

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

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

📎 前提:べき等性と再実行 | 関連:SQL変換とdbtデータガバナンスとカタログ

要点(BLUF)

概念 ── 品質の次元

次元問いテスト例
完全性欠損がないかemail IS NULL の件数
一意性重複がないかCOUNT(*) - COUNT(DISTINCT id)
整合性参照先が存在するか親に無い外部キーの件数
妥当性値域・形式が正しいかstatus NOT IN (...) の件数
鮮度十分新しいかMAX(updated_at) が閾値より古い

仕組み ── 検査クエリは0を返せば合格

「違反を数える」クエリを並べ、0でなければFAILにします。

-- not_null: emailの欠損
SELECT COUNT(*) FROM customers WHERE email IS NULL;
-- unique: cust_idの重複(総数 - 異なり数)
SELECT COUNT(*) - COUNT(DISTINCT cust_id) FROM customers;
-- accepted_values: 想定外のstatus
SELECT COUNT(*) FROM customers WHERE status NOT IN ('active','churned');

実行結果(実機・SQLite/わざと汚したデータ):

not_null(email)   : 違反 1 件 -> FAIL
unique(cust_id)   : 違反 1 件 -> FAIL
accepted(status)  : 違反 1 件 -> FAIL

3つとも違反を検出。「違反行を数える」だけで、ほとんどの品質次元はテストにできます。これがdbtテストやGreat Expectationsの中身でもあります(→ SQL変換とdbt)。

設計の勘所 ── どこで・何を・どうするか

flowchart LR
    SRC["取り込み"] --> T1["入口テスト(契約:型・必須・一意)"]
    T1 --> TR["変換"] --> T2["出口テスト(整合・値域・鮮度)"]
    T2 --> SRV["提供"]
    T1 -.失敗.-> STOP["停止 or 隔離(quarantine)"]
    T2 -.失敗.-> STOP

なぜそうするか ── 下流の信頼を守る

なぜ品質をテストで自動化するのか。壊れたデータは下流(ダッシュボード・ML)に静かに流れ、間違った意思決定を生むからです。しかもデータの破損は、コードのバグより気づきにくい(エラーを出さず“それらしい数字”になる)。だから「契約をテストにして、違反したらパイプラインを止める」ことで、間違った数字が世に出る前に堰き止める。テストが無いパイプラインは、型のないコードと同じで、壊れて初めて気づきます。

⚠️ よくある落とし穴

対応ラボ

data-engineering-study/labs/04_etl_pipeline.pyPYTHONIOENCODING=utf-8 で実行・not_null/unique/accepted_valuesの検出を確認済み)。

関連

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