Mímisbrunnr知恵の泉

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

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

📎 前提:レイクハウスとテーブルフォーマットSQL変換とdbt | 関連:データ品質とテストスタースキーマと次元モデリング

要点(BLUF)

概念 ── 段階的に品質を上げる

一気に「生→提供」を作ると、変換が一枚岩になりテストも再処理も困難です。メダリオンは間に「整形済み(silver)」を挟み、各層に明確な役割を与えます。

flowchart LR
    SRC["ソース"] --> B["bronze(生のまま・履歴保持)"]
    B --> S["silver(型整え・重複/NULL除去・結合)"]
    S --> G["gold(集計・次元モデル・提供用)"]
    G --> BI["BI・ML・分析"]
責務
bronze生をそのまま蓄積(監査・再処理の起点)取り込んだログ・CDCの生レコード
silverクレンジング・標準化・結合重複排除・NULL処理・型変換・名寄せ
goldビジネス集計・次元モデル商品別日次売上・KPI・スタースキーマ

仕組み ── bronze → silver → gold を実演

生データ(重複・NULL・文字列の金額)を、層ごとに磨きます。

-- silver: NULL除去 + order_id重複の代表行 + 型変換
CREATE TABLE silver_sales AS
SELECT order_id, product, CAST(amount AS INTEGER) AS amount, ymd
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY raw_id) rn
      FROM bronze_sales WHERE amount IS NOT NULL)
WHERE rn = 1;

-- gold: 商品別・日別の売上集計
SELECT ymd, product, SUM(amount) AS sales, COUNT(*) n
FROM silver_sales GROUP BY ymd, product ORDER BY ymd, sales DESC;

実行結果(実機・SQLite):

bronze(生)       : 6 行
silver(整形済み) : 4 行(重複1・NULL1を除去)
gold(集計)       :
   ('2026-06-01', 'Coffee', 900, 1)
   ('2026-06-01', 'Cake', 800, 1)
   ('2026-06-02', 'Cake', 1600, 1)
   ('2026-06-02', 'Coffee', 1500, 1)

bronzeの6行(汚れ込み)が、silverで4行(重複1・NULL1を除去)に整い、goldで提供用の集計になります。各層が「1つの責務」だけを果たすので、どこで何をしたかが明快です。

設計の勘所 ── 層の規律

なぜそうするか ── 責務分離が再処理を生む

なぜ3層に分けるのか。変更と障害に強くなるからです。変換ロジックを直したいとき、生(bronze)が残っていれば silver/gold を作り直すだけ。源に取りに戻らずに済みます。バグを見つけたときも、「bronzeは正しいがsilverがおかしい」と層で切り分けられ、原因特定が速い。一枚岩の変換では、この「どこで壊れたか」が分からず、源から全部やり直しになりがちです。層の数(3つ)より、各層に単一責務を与えることが本質です。

⚠️ よくある落とし穴

対応ラボ

data-engineering-study/labs/05_warehouse_lakehouse.pyPYTHONIOENCODING=utf-8 で実行・bronze/silver/goldの行数と集計を確認済み)。

関連

第5章 データウェアハウスとレイクハウス 目次