本文へ移動

ホーム / Data / 第2部 データの基礎

第2部 データの基礎・第4章

ストレージとファイル形式

★★☆ 重要7トピック・面接 3問

大量のデータを安く速く保存・読み込むための仕組みを押さえる。

4.1行指向と列指向

用語★★☆ 重要
ひとことで

分析は一部の列を大量に読むので、列ごとにまとめて圧縮する列指向が速い。

業務 DB の多くは行指向で、1行のすべての列をまとめて保存します。1件の注文を読んだり書いたりするのに向いています。分析では「1億行の中の金額と日付の列だけ」を読むことが多いので、列ごとにまとめて保存する列指向のほうが、読む量がずっと少なくて済みます。Parquet は列指向のファイル形式の定番で、データレイクやレイクハウスの標準になっています。

金額の合計を出すとき、どこを読むか行指向1行ずつ並ぶ列指向列ずつ並ぶ11東京210032東京大阪大阪200東京3100東京200150150金額だけほしいのに、9マス全部を読む金額の3マスだけ読む。同じ型・似た値が並ぶので圧縮も効くParquet:行グループごとに列の最小値・最大値を持ち、条件に合わない塊を読み飛ばす
行指向と列指向の並び方(3行×3列のデータ)
行指向(CSV・業務 DB)列指向(Parquet・ORC・DWH)
得意1行の読み書き・更新一部の列を大量に読んで集計
読む量使わない列も読む使う列だけ読む
圧縮効きにくい同じ型・似た値が並ぶので効きやすい
苦手大量の集計1行ずつの更新・追記

Parquet の中身(行グループ・エンコーディング)

面接ではこう答える

業務 DB の多くは1行の全部の列をまとめて保存する行指向で、1件の読み書きに向きます。分析では1億行の中の数列だけを読むことが多いので、列ごとにまとめて保存する列指向のほうが読む量がずっと少なく、同じ型の値が並ぶので圧縮も効きます。Parquet は列指向のファイル形式の定番で、DWH の内部も列指向です。そのかわり列指向は1行ずつの更新や追記が苦手です。

ひとことで

行グループ・列ごとのかたまり・ページに分け、エンコーディングと圧縮をかけ、最小値・最大値で読み飛ばせるようにした列指向のファイル形式。

Parquet が速いのは、列指向であることに加えて、ファイルの中に読み飛ばすための情報を持っているからです。

Parquet ファイルの中身行グループ 1数百万行ずつの区切り。中は列ごとにまとまる列のかたまりorder_date・amount… 列ごとに圧縮ページエンコーディングと圧縮の単位フッタースキーマと、行グループごとの最小値・最大値
フッターの統計で、条件に合わない行グループを読み飛ばす

Parquet はファイルをいくつかの行グループに分け、その中で列ごとにまとめます。列の中では値を小さく表す工夫(エンコーディング)をします。種類の少ない列(都道府県など)は辞書エンコーディングで値を番号に置き換え、同じ値の連続はランレングス(「東京が 500 回」)で表します。その上に Snappy や Zstandard などの圧縮をかけます。さらに行グループごとに列の最小値・最大値を持っているので、WHERE order_date = … の条件に合わない行グループを読まずに飛ばせます。

工夫すること効くとき
辞書エンコーディング値を番号に置き換える種類の少ない列(都道府県・状態)
ランレングス同じ値の連続を「値×回数」で表す並べ替えたあとの列
圧縮(Snappy・Zstandard など)エンコーディングの上からさらに縮めるほぼいつも
最小値・最大値の統計条件に合わない行グループを読まないよく絞る列で並べてから書いたとき

面接ではこう答える

Parquet はファイルを行グループに分け、その中で列ごとにまとめて保存します。列の中では辞書エンコーディングやランレングスで値を小さく表し、さらに圧縮をかけます。フッターには行グループごとの最小値・最大値があるので、条件に合わない行グループは読み飛ばせます。よく絞る列で並べてから書くと、読み飛ばしがよく効きます。

ファイル形式は「誰が、どう読むか」で選びます。取り込みの途中と、分析で読む置き場所で形式を変えるのが普通です。

形式並び型の情報向くところ
CSV行なし(すべて文字)人が開く・外部とのやり取り。区切り文字や改行の扱いで壊れやすい
JSON(1行1件の JSON Lines)行ゆるいAPI・ログ。入れ子をそのまま置ける。大きいと読むのが遅い
Avro行スキーマを持つKafka(イベントを順番に溜めて、複数の受け手に配る仕組み)のイベント、1件ずつ書く取り込み。スキーマの変化を扱いやすい
Parquet・ORC列スキーマを持つ分析で読む置き場所。圧縮と読み飛ばしが効く

よくある形は、届いたままの形(JSON・CSV)を生の置き場所に保存し、整えたものを Parquet で書くことです。生のファイルを残しておけば、変換を直したときにやり直せます。CSV を取り込むときは、文字コード・区切り文字・引用符・ヘッダーの有無・日付の書き方を最初に決めておきます。

ストリームや細かいバッチで書き続けると、小さなファイルが大量にたまります。クエリのエンジンはファイルを1つずつ開いて中の情報を読むので、データの量が同じでもファイルの数が多いほど遅くなり、オブジェクトストレージへのリクエストの料金も増えます。

小さなファイルをまとめ直す(コンパクション)小さなファイル1MB × 10,000個開くだけで時間がかかるコンパクション定期的にまとめ直すテーブル形式の機能でも大きなファイル数百MB × 数十個読むのが速い
開く回数が減り、読み飛ばしの統計も効きやすくなる

Parquet の公式ドキュメントは行グループを 512MB〜1GB と大きめにすることを勧めています。実務では、1ファイル数百 MB〜1GB 程度を目安に、定期的にまとめ直すことが多いです(コンパクション)。また、よく絞り込む列で並べてから書くと、最小値・最大値による読み飛ばしがよく効きます。

  • 書く側で、出力のパーティション数(Spark の repartition・coalesce)を調整して、ファイルを作りすぎない。
  • Iceberg・Delta Lake などのテーブル形式には、ファイルをまとめ直す機能がある。夜間などに定期的に流す。
  • パーティションを細かく切りすぎない(日付×ユーザーなど)。1つのパーティションのデータが少ないほど、ファイルは小さくなる。

データレイクでは、dt=2026-11-02/ のようにフォルダの名前に列の値を入れて置く形(Hive 形式)がよく使われます。クエリのエンジンは条件に合うフォルダだけを読むので、DWH のパーティションと同じように読む量を減らせます。

フォルダの名前で区切る(Hive 形式)s3://lake/events/dt=2026-11-01/part-0000.parquetdt=2026-11-02/part-0000.parquetpart-0001.parquetdt=2026-11-03/WHERE dt = '2026-11-02'→ dt=2026-11-02 のフォルダだけを読むdt の列は、ファイルの中ではなくフォルダの名前から作られる
Hive 形式のパーティションの置き方
決めること目安
何で区切るかほとんどのクエリが絞る列。多くは日付
どの細かさで1つのパーティションが小さすぎないように。データが少なければ月単位
区切ってはいけない列ユーザー ID など種類がとても多い列(フォルダが爆発的に増える)
日付の基準イベントの時刻か、届いた時刻か。UTC か日本時間か

テーブル形式の Iceberg では、列の値から区切りを自動で計算する仕組み(隠れたパーティション)があり、利用者がフォルダの形を意識せずに済みます。

ひとことで

安いオブジェクトストレージに置くレイク、速く管理しやすい DWH、その両方を目指すレイクハウス(Iceberg・Delta)。

分析用のデータの置き場所には大きく3つの考え方があります。

安いストレージの上に「テーブル形式」をのせるSparkTrinoDWHBI・MLテーブル形式(Iceberg・Delta Lake・Hudi)メタデータで「今のテーブルはどのファイルか」を管理 → 更新・削除・タイムトラベルオブジェクトストレージ(S3・GCS など)Parquet ファイルがたくさん並ぶ
レイクハウスの構成
データレイクDWHレイクハウス
置き場所オブジェクトストレージ(S3・GCS など)にファイルDWH の中(形式は製品が管理)オブジェクトストレージに、テーブル形式つきのファイル
入れられるもの何でも(CSV・JSON・画像・ログ)主に表の形のデータ表のデータが中心。生のファイルも同じ場所に置ける
強み安い・大量に置ける・形を決めずに置ける速い・SQL・権限・更新が簡単安く置きつつ、更新・取り消し・履歴を扱える。複数のエンジンで読める
弱み更新や削除が難しく、中身の管理が崩れやすい(データの沼)保存と計算が割高になりがち。製品に縛られる小さなファイルの整理などの運用が要る

テーブル形式(Iceberg・Delta Lake)の仕組み

最近は DWH の側も Iceberg などの外部テーブルを読めるようになり、境目は小さくなっています。選ぶときは「誰がどのエンジンで読むか」「更新や削除がどのくらいあるか」「運用に人を割けるか」で決めます。

面接ではこう答える

データレイクはオブジェクトストレージに何でもファイルで置く方式で、安く大量に置けますが更新や管理が崩れやすいです。DWH は速く、SQL・権限・更新が簡単ですが、割高になりがちで製品に縛られます。レイクハウスは、オブジェクトストレージの Parquet に Iceberg や Delta Lake などのテーブル形式をかぶせて、安く置きつつ更新や履歴を扱い、複数のエンジンから読めるようにする方式です。誰がどのエンジンで読むか、更新や削除の量、運用の人手で選びます。

ひとことで

Parquet ファイルの集まりを、メタデータで1つのテーブルとして扱い、ACID の更新やタイムトラベルをできるようにする仕組み。

メタデータが「今のテーブルの中身」を指すカタログ今のメタデータスナップショット 1スナップショット 2(MERGE のあと)a.parquetb.parquetc.parquet(新)古い版を読む=タイムトラベル書き込みは新しいスナップショットを作り、最後にカタログの指す先を切り替える(途中の状態は見えない)
テーブル形式(Iceberg の例)の仕組み

テーブル形式(Apache Iceberg・Delta Lake・Apache Hudi)は、Parquet ファイルの集まりを「1つのテーブル」として扱うための仕組みです。どのファイルがテーブルの今の中身かをメタデータで管理するので、次のことができるようになります。

  • 書き込みの途中で読んでも、半端な状態が見えない(ACID のトランザクション)
  • UPDATE・DELETE・MERGE(個人情報の削除依頼にも対応できる)
  • 過去の時点のテーブルを読む(タイムトラベル)・間違えたら戻す
  • 列の追加などスキーマの変更、Spark・Trino・DWH など複数のエンジンからの読み書き

メタデータが増え続けるので、古いスナップショットの削除や小さなファイルのまとめ直しを定期的に流す運用が要ります。古いスナップショットを消すと、その時点へのタイムトラベルはできなくなります。

面接ではこう答える

テーブル形式は、オブジェクトストレージの Parquet ファイルの集まりを1つのテーブルとして扱うための仕組みで、Iceberg・Delta Lake・Hudi があります。どのファイルが今のテーブルの中身かをメタデータで管理し、書き込みは新しいスナップショットを作って最後に切り替えるので、途中の状態が見えず、UPDATE や DELETE、過去の時点を読むタイムトラベルもできます。Spark や Trino、DWH など複数のエンジンから同じテーブルを読めるのも利点です。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 行指向と列指向、Parquet の中身
  • ファイルの数と大きさ、パーティションの切り方
  • データレイク・DWH・レイクハウスとテーブル形式

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1Parquet が分析に向いている理由は?

模範回答

理由は3つあります。1つ目は列指向であることで、分析は一部の列を大量に読むことが多いので、必要な列だけを読めば読む量が大きく減ります。2つ目は圧縮で、同じ型の似た値が並ぶので、辞書エンコーディングやランレングスと圧縮がよく効き、CSV よりかなり小さくなります。

3つ目は述語のプッシュダウンで、行グループごとに列の最小値・最大値を持っているため、WHERE の条件に合わない部分を読まずに飛ばせます。さらに型の情報(スキーマ)をファイルに持っているので、CSV のように読むたびに型を推測しなくて済みます。逆に1行ずつの更新は苦手なので、更新が必要なら Iceberg などのテーブル形式と組み合わせます。

深掘りされたら

  • 小さな Parquet ファイルが大量にできると何が困りますか?

見られているポイント列指向・圧縮・述語のプッシュダウン

Q2データレイク・DWH・レイクハウスのどれを選ぶか、どう判断しますか?

模範回答

「誰がどのエンジンで読むか」「更新や削除がどのくらいあるか」「運用に人を割けるか」で決めます。主な利用者が SQL で分析する人で、データが表の形にそろっているなら、DWH が速く、権限やチューニングも製品に任せられるので一番手軽です。画像やログなどの生のファイルを大量に安く置きたい、Spark など複数のエンジンで読みたいなら、レイクが向きます。

レイクの安さを保ちつつ更新・削除・過去の時点の読み込みもしたいなら、Iceberg や Delta Lake を使ったレイクハウスです。ただし小さなファイルの整理などの運用が増えるので、チームの体制も合わせて考えます。最近は DWH から Iceberg のテーブルを読めることも多いので、両方を組み合わせる構成もよく選ばれます。

深掘りされたら

  • Iceberg のようなテーブル形式がないと、何が困りますか?

見られているポイント要件と運用の体制から選べるか

Q3データレイクのクエリが遅いです。何を確かめますか?

模範回答

まずファイルの数と大きさを見ます。小さなファイルが大量にあると、開くだけで時間がかかるので、まとめ直し(コンパクション)をします。次に、ファイル形式が CSV や JSON なら、列指向の Parquet に変えるだけで読む量が大きく減ります。

そのうえで、よく絞り込む列(日付など)でパーティションが切られているか、クエリの条件がパーティションの刈り込みに効く書き方になっているかを確かめます。パーティションを細かくしすぎて、かえって小さなファイルが増えていることもあります。最後に、よく絞る列でデータを並べてから書くと、Parquet の最小値・最大値の統計で読み飛ばせる範囲が増えます。

深掘りされたら

  • パーティションの切り方は、どう決めますか?

見られているポイントファイル数・形式・パーティションの順に切り分けられるか