構造化・非構造化を生のまま保存する大規模ストレージ
データを「分析・モデリングに使える形に整える」工程。 分析の質はここで 8 割決まります。
本ページでは データレイク を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。
構造化・非構造化を生のまま保存する大規模ストレージ
英語名 Data Lake。
この用語を理解・使用するときは、 次のような前提を意識してください:
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.shape) print(df.dtypes) print(df.describe()) # 「データレイク」の文脈で扱う場合の例: # 分野: データエンジニアリング # 関連手法は同カテゴリの他用語を参照してください。 |
具体的なコードは データエンジニアリング を参照してください。
分析結果を報告するときに含めるべき情報:
データレイク ── 構造化・半構造化・非構造化を問わず生のまま低コストに蓄積する大規模ストレージ。 ETL 後に整える DWH と対照的に 「貯めてから考える」 思想。
データレイクは データエンジニアリング の蓄積層の中核です。 上流は データ収集 ・ センサー ・ SNS ・ 行動ログ、 下流は DataFrame ・ BI ・ ML パイプライン。
対比概念は データウェアハウス(DWH、 整形済み・スキーマ厳格)とRDB(行指向・トランザクション)。 「型が決まっていない / 後で型を決めたい」生データはレイクへ、 「定型集計が走る」整形済みは DWH へ、と使い分けます。
Databricks が広めた Bronze / Silver / Gold 3 層構造が定石。 段階的にデータを精錬していくモデルです:
| 層 | 役割 | 形式 | 利用者 |
|---|---|---|---|
| Bronze(生) | 取り込みそのまま、 監査用 | JSON, CSV, ログ原文 | 基盤エンジニア |
| Silver(整形済) | クレンジング、 名寄せ済 | Parquet/Delta、 型定義あり | データサイエンティスト |
| Gold(業務向け) | 事業 KPI に集計 | 星型・スター スキーマ | アナリスト・BI |
この階層化が、 「データを失わず、 用途別に最適化する」レイクの核心。 Bronze には全てを残し、 Silver / Gold は再生成できる前提で設計します。
| フォーマット | 指向 | 圧縮率 | 向く用途 |
|---|---|---|---|
| CSV | 行 | 低(圧縮しない場合) | 交換、 簡易共有 |
| JSON | 行 | 中 | 半構造化、 ログ |
| Avro | 行 | 高 | Kafka 連携、 ストリーミング |
| Parquet | 列 | 高(10倍) | 分析、 OLAP の定番 |
| ORC | 列 | 高 | Hive エコシステム |
| Delta Lake | 列+ログ | 高 | ACID、 Time Travel |
| Iceberg | 列+メタ | 高 | ベンダ中立、 スキーマ進化 |
| Hudi | 列+ログ | 高 | 更新が多いストリーム |
2025 年現在、 列指向(Parquet)+テーブルフォーマット(Iceberg/Delta)の組合せが事実上の標準。 CSV は人間用、 内部処理は Parquet が無難です。
クラウドデータレイクの月額コストは大きく次の和で表せます:
$$ C_{\text{月}} = C_s + C_r + C_w + C_q $$
$C_s$=ストレージ容量料、 $C_r$=API リクエスト料、 $C_w$=ネットワーク転送料、 $C_q$=クエリ料(Athena/BigQuery 等)。 ストレージは安いが、 「クエリで全件スキャン」を繰り返すと $C_q$ が急増。 列指向+パーティション分割で対策します。
| 項目 | 単価(参考) | 節約策 |
|---|---|---|
| S3 Standard | $0.023 / GB / 月 | 古いデータは IA / Glacier へ |
| S3 リクエスト | $0.005 / 1000 PUT | 小ファイルを結合(compaction) |
| Athena | $5 / TB スキャン | パーティション・列指向・LIMIT |
| BigQuery | $6.25 / TB | 同上、 予約計算枠 |
| 転送 (外向き) | $0.09 / GB | 同リージョン内で完結 |
(1) SSDSE-B のような CSV を S3 へ Parquet で投入:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd import boto3 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) # 年でパーティション分割した Parquet 出力 df.to_parquet('data/lake/bronze/ssdse_b.parquet', partition_cols=['年度'], compression='snappy') # S3 にアップロード boto3.client('s3').upload_file( 'data/lake/bronze/ssdse_b.parquet', 'my-data-lake', 'bronze/ssdse/year=2026/data.parquet') |
(2) DuckDB で S3 上の Parquet をローカル PC から直接クエリ(最近の定番):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import duckdb con = duckdb.connect() con.execute("INSTALL httpfs; LOAD httpfs;") # S3 上の Parquet 全体に SQL(必要列のみ列指向で読み込み) q = """ SELECT 都道府県, AVG(高齢化率) AS avg_aging FROM read_parquet('s3://my-data-lake/silver/ssdse/*.parquet') GROUP BY 都道府県 ORDER BY avg_aging DESC LIMIT 10; """ print(con.execute(q).fetch_df()) |
(3) Delta Lake で ACID トランザクション:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from deltalake import write_deltalake, DeltaTable # 初回書き込み write_deltalake('data/lake/silver/ssdse', df, mode='overwrite') # 更新(UPSERT 風) dt = DeltaTable('data/lake/silver/ssdse') dt.merge( source=df, predicate='source.都道府県 = target.都道府県 AND source.年度 = target.年度', source_alias='source', target_alias='target', ).when_matched_update_all().when_not_matched_insert_all().execute() # Time Travel:1 バージョン前の状態を取得 old = DeltaTable('data/lake/silver/ssdse', version=0).to_pandas() print(old.head()) |
全国 1000 店舗、 1 日数千万件の POS データを 5 年保管する設計を考えます:
2020 年以降のトレンドが レイクハウス。 レイク(柔軟性)と DWH(信頼性)のいいとこ取りを目指します:
| 特性 | レイク | レイクハウス | DWH |
|---|---|---|---|
| スキーマ | on read | 柔軟+強制 | on write 厳格 |
| ACID | × | ○ | ◎ |
| Time Travel | △ | ○ | × |
| 非構造化 | ◎ | ○ | × |
| ML 連携 | ◎ | ◎ | △ |
| BI 性能 | △ | ○ | ◎ |
| コスト | 低 | 中 | 高 |
代表実装:Databricks Lakehouse、 Snowflake on Iceberg、 BigQuery + BigLake。 統合データ基盤として人気上昇中。
「データレイク」という言葉そのものが比喩です。 川(データソース)から流れ込んだ水(データ)が、 形を整えずにそのまま大きな湖に溜まるイメージ。 利用者は釣り糸を垂らすように、 必要な時に必要な形でデータを取り出します。
対照的に、 データウェアハウス(DWH)は ペットボトル飲料 のような存在。 工場で品質管理され、 規格化されて店頭に並んでいる。 そのまま飲める一方、 「もう作り直せない」「色付き水(型変更)が欲しくても無理」という制約があります。
この自由度こそ「貯めてから考える(schema-on-read)」哲学の本質で、 IoT や SNS のように「将来どう使うか未知の」データを扱う現代において、 DWH より柔軟性が高い基盤として選好されるようになりました。
典型的なデータレイクの処理フローを順に追います。 各段階で使うツールも例示:
| 段階 | 入力 | 処理 | 出力 | ツール例 |
|---|---|---|---|---|
| 1. 取得 | DB / API / IoT | バッチ/ストリーム取得 | 生 JSON, CSV | Fivetran, Kafka |
| 2. 着地 (Bronze) | 生データ | そのまま蓄積 | Bronze テーブル | S3 + Iceberg |
| 3. 整形 (Silver) | Bronze | クレンジング、 型統一 | Silver テーブル | Spark, dbt |
| 4. 集計 (Gold) | Silver | 業務 KPI 集計 | Gold テーブル | dbt, Spark SQL |
| 5. 提供 | Gold | BI/ML/API | レポート, 予測 | Tableau, MLFlow |
| 6. 監視 | 全層 | 品質・SLA | アラート | Monte Carlo, Soda |
| 機能 | AWS | Google Cloud | Azure | Databricks |
|---|---|---|---|---|
| ストレージ | S3 | GCS | Blob/ADLS Gen2 | 下層は各社 |
| クエリエンジン | Athena, Redshift Spectrum | BigQuery (Omni) | Synapse, Fabric | Photon |
| テーブル | Iceberg, Hudi, Delta | Iceberg, BQ | Delta, Iceberg | Delta(主) |
| カタログ | Glue Catalog | Dataplex | Purview | Unity Catalog |
| ETL | Glue, EMR | Dataproc, Dataflow | Synapse, DF | Workflows |
| 価格モデル | 従量 | 従量+予約 | 従量+予約 | DBU 課金 |
既存のクラウド契約に合わせるのが王道。 マルチクラウドなら Iceberg + Trino のオープン構成を検討。
環境/層/ドメイン/テーブル/パーティション の階層Q1. DWH と何が違うの?
DWH は 事前に スキーマ・前処理を厳格に行ってから格納するのに対し、 レイクは生のまま放り込んでクエリ時に解釈。 「先に整える vs 後で整える」が本質的な違い。 近年は両者の中間「レイクハウス」が主流。
Q2. オンプレ HDFS は今でも有効?
大企業のレガシーは現役ですが、 新規はクラウドのオブジェクトストレージ(S3/GCS/Blob)が主流。 オンプレ存続なら MinIO 等の S3 API 互換 OSS が選択肢。
Q3. 小規模なら DuckDB で十分?
数 TB までならローカル PC+DuckDB が最速・最安。 「ビッグデータ」と称しても実際は数十 GB 級、 ということが多く、 過剰スペック化への警鐘もあります。
Q4. Delta vs Iceberg、どちらを選ぶ?
Databricks 中心なら Delta、 AWS/オープン環境なら Iceberg が無難。 Iceberg は Snowflake, BigQuery, Trino など複数エンジン対応で、 ベンダ ロックイン回避の観点で支持を集めています。
Q5. 個人情報はレイクに入れていい?
入れてよいが、 ① 暗号化保管(KMS)、 ② IAM/RBAC でアクセス制御、 ③ マスキングビューでの参照、 ④ データガバナンス 規程の整備、 が必要。 「個人情報専用ゾーン」を分離して別バケットにする設計が多い。