5.

ORC (.orc) | Apache ORC Hive 由来の列指向フォーマット解説

編集
この記事の要点
  • ORC (Optimized Row Columnar) は Apache Hive 由来の列指向形式
  • Parquet と同じく列指向+圧縮。Stripe → RowGroup → Column の階層構造
  • 軽量インデックス(min/max/bloom filter)を埋め込み、predicate pushdown が強力
  • Hadoop / Hive / Trino / Spark で第一級サポート。Parquet とほぼ同性能
  • Parquet と用途は被るが、Hive ベースのスタックなら ORC、Spark/Pandas 中心なら Parquet を選ぶ慣習

要点

  • Apache ORC (Optimized Row Columnar) は Hortonworks が Hive のために 2013 年に開発した列指向ファイル形式。拡張子は .orc
  • Parquet と並ぶ二大列指向フォーマットで、性能面はワークロード次第でほぼ互角。Hive/HDP/CDP の Hadoop ディストリビューション圏内では ORC が第一候補
  • 内部は Stripe(行ストライプ)→ Row Group → Stream の階層構造。Stripe 単位の min/max/sum などをファイル内に持ち、強力な Predicate PushdownBloom Filter が効く。
  • デフォルトの圧縮は ZLIB だが、近年は ZSTD が推奨。Snappy / LZ4 も選べる。

概要

ORC は Hive 0.11(2013 年)で導入されたフォーマットで、当時 Hive が抱えていた「RCFile では遅い、Parquet は Cloudera 寄り」という事情に対する Hortonworks 側の回答だった。Apache 配下に移ったあとは Hive と密結合のまま独自に進化し、ACID トランザクション更新/削除Bloom Filter インデックスといった、Parquet にはない(あるいは後追いになった)機能を先行して搭載してきた。

用途的には「Hive 上の DWH」「LLAP 経由のインタラクティブ分析」「Druid / Presto / Trino からの参照」が中心。クラウド DWH やデータレイク文脈では Parquet が優勢だが、オンプレ Hadoop が残る大企業では現役の選択肢である。Spark からも spark.read.orc() で透過的に扱える。

列指向ファイル全般の利点(必要な列だけ IO、列単位の高圧縮、Predicate Pushdown による Row Group スキップ)はすべて ORC でも有効で、CSV と比べた読み込み高速化倍率や圧縮率は Parquet と同等オーダーである。両者を選ぶ基準は技術的というより「自分の環境のエコシステムが何を主に読み書きするか」で決まる。

内部構造

ORC ファイルは Stripe という大きな単位で行を区切る。Stripe のデフォルトサイズは 64 MB〜256 MB で、Parquet の Row Group に相当する並列処理単位である。

  1. Stripe: 一定行数をまとめた塊。内部にインデックス、データ、Stripe フッタを持つ。
  2. Row Group: Stripe 内の 10,000 行単位の細かい区分。各 Row Group の min/max/sum などを Stripe インデックスに持ち、これが Predicate Pushdown の主役になる。
  3. Stream: 列ごとの実データ。さらに「PRESENT(NULL ビット)」「DATA(値)」「LENGTH(可変長)」「SECONDARY(補助)」の 4 種類のストリームに分解される。

ファイル末尾には File FooterPostScript があり、PostScript はファイルサイズ・圧縮種別といった起動情報、Footer は各 Stripe の位置・スキーマ・統計を持つ。クエリエンジンは PostScript → Footer → 必要 Stripe の順に読み込み、不要な Stripe はバイナリレベルでスキップする。

追加で Bloom Filter を列ごとに作成でき、等価条件(id = 12345 のような点クエリ)に対して特定の Stripe を読まずに済む。これは Parquet にも後追いで入ったが、ORC では仕様の早い段階から組み込まれている。

主な用途

  • Hive 上の DWH テーブル: STORED AS ORC がほぼデフォルト。圧縮率と速度の両立で TEXTFILE/RCFile から置き換えられた。
  • ACID/Update のあるテーブル: Hive ACID は ORC 形式が前提。Delta ファイルをマージしながら更新を扱える。
  • Trino / Presto / Spark からの読み出し: 既存の ORC データレイクに直接 SQL を投げる構成。
  • 長期アーカイブ: ZSTD で圧縮した ORC は CSV の 1/10〜1/20 程度になることが多く、コールドデータの保管にも向く。

関連形式との比較

形式主な戦場強み弱み
ORCHive / HadoopACID、Bloom Filter、高圧縮Hive 圏外の支援が薄め
Parquetクラウド DWH / Spark / Python事実上の標準、エコシステム広い更新は不得手
AvroKafkaスキーマ進化、行追記分析は遅い
CSV受け渡し人間可読遅い・大きい・型なし

結論として、「Hive を中心に据えるなら ORC、その他は Parquet」が大筋の指針となる。詳細比較は CSV(.csv)Parquet の記事と併せて参照すると分かりやすい。

コマンド・ツール

公式の CLI orc-tools で中身を覗ける。

$ java -jar orc-tools-1.9.0-uber.jar meta sales.orc
Processing data file sales.orc [length: 5,234,112]
Structure for sales.orc
File Version: 0.12 with ORC_135
Rows: 1,234,567
Compression: ZSTD
Compression size: 262144
Type: struct<id:bigint,amount:double,ts:timestamp>

$ java -jar orc-tools-1.9.0-uber.jar data sales.orc | head

Python では pyarrow が ORC を読み書きできる。

import pyarrow.orc as orc
table = orc.read_table("sales.orc")
df = table.to_pandas()

Hive/Spark からはネイティブに扱えるので、変換は SQL レベルで完結する。

-- Hive
CREATE TABLE sales_orc STORED AS ORC AS SELECT * FROM sales_text;

-- Spark
spark.read.csv("sales.csv").write.format("orc").save("/dl/sales_orc")

注意点

  • Hadoop 圏外でのライブラリ成熟度: Python の純粋 ORC ライブラリは限られ、pyarrow 経由が現実解。Parquet ほど周辺ツールは多くない。
  • Stripe サイズと並列度: 64MB を切るような小さな Stripe を多数持つと、メタデータ往復で遅くなる。書き出し時に orc.stripe.size を意識する。
  • 更新可能テーブルは特殊: ACID ORC は基本ファイル + Delta ファイル + Compaction の構成。素の ORC として外部ツールで読むと、更新が反映されない場合がある。
  • Bloom Filter の対象指定: デフォルトでは作られない。orc.bloom.filter.columns で列を指定して書き出す。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SQL ダンプ(.sql)
  2. SQLite(.sqlite / .sqlite3 / .db)
  3. Parquet(.parquet)
  4. Avro(.avro)
  5. ORC(.orc)
  6. NDJSON / JSONL(.ndjson / .jsonl)
  7. BSON(.bson)
  8. Protocol Buffers(.proto)
  9. Feather / Arrow IPC(.feather / .ipc / .arrow)
  10. DB ダンプ(.dump / .bak)

最近更新/作成されたページ