Mímisbrunnr知恵の泉

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

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

📎 前提:ファイルフォーマットとシリアライゼーションデータウェアハウス | 関連:レイクハウスとテーブルフォーマット

要点(BLUF)

概念 ── 「とりあえず全部置く」湖

DWHは「整ったものだけ」を入れますが、レイクは「生のまま何でも」を受け入れます。JSONログ・画像・CSV・Parquetが同じストレージに同居できる。後から「やっぱりこのログも分析したい」となっても、捨てていなければ使えます。

flowchart TB
    LOG["アプリログ(JSON)"] --> LAKE["データレイク(オブジェクトストレージ)"]
    IMG["画像・音声"] --> LAKE
    CSV["CSV/Parquet"] --> LAKE
    LAKE --> ENG["読むとき構造を解釈(スキーマオンリード)"]

仕組み ── オブジェクトストレージとパーティション

オブジェクトストレージは「キー(パス)→ オブジェクト(ファイル)」のフラットな巨大KVストア。ディレクトリは見かけ上のもので、安価・ほぼ無限・高耐久だが、ファイルシステム的な追記・ロックは弱い。

性能の鍵がパーティション分割。よく絞り込む列(日付など)でフォルダを分けて置くと、クエリが不要なフォルダを丸ごと読み飛ばせます(パーティションプルーニング)

df.to_parquet(path, partition_cols=["ymd"])               # 日付で分けて書く
one = pd.read_parquet(path, filters=[("ymd","==","2026-06-02")])  # 1日分だけ読む

実行結果(実機):

生成パーティション: ['ymd=2026-06-01', 'ymd=2026-06-02']
2026-06-02 だけ読込 -> 3 行, 売上合計=3350

ymd=2026-06-01/ymd=2026-06-02/ にデータが分かれ、6月2日を指定するとそのフォルダだけI/Oして3行を読みます。テーブルが何年分あっても、1日分のクエリは1日分しか読まない——これがレイクのスケール術です。

設計の勘所 ── DWH と レイクの対比

観点DWHデータレイク
データ形式構造化中心何でも(構造化〜非構造化)
スキーマオンライト(事前)オンリード(読む時)
コスト高め(計算込み)安い(ストレージのみ)
品質保証高い(管理される)自前(沼化リスク)
主な利用者アナリスト・BIデータサイエンティスト・ML

なぜそうするか ── 安さと柔軟さを別に確保する

なぜDWHと別にレイクを持つのか。「安く貯める」と「速く分析する」を別レイヤーで最適化できるからです。生データを高価なDWHに全部入れると費用がかさむ。安いレイクに全部貯め、分析が必要な部分だけDWH(やレイク上のエンジン)で処理する。ELT(→ ETLとELT)の「まず生をロード」も、安いレイクがあって成立します。ただし「貯めただけ」では沼。次節のレイクハウス(→ レイクハウスとテーブルフォーマット)は、この沼問題に「テーブルの規律」で答えます。

⚠️ よくある落とし穴

対応ラボ

data-engineering-study/labs/05_warehouse_lakehouse.pyPYTHONIOENCODING=utf-8 で実行・パーティション分割と読み飛ばしを確認済み)。

関連

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