| この記事の要点 |
|
概要
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 に相当する並列処理単位である。
- Stripe: 一定行数をまとめた塊。内部にインデックス、データ、Stripe フッタを持つ。
- Row Group: Stripe 内の 10,000 行単位の細かい区分。各 Row Group の min/max/sum などを Stripe インデックスに持ち、これが Predicate Pushdown の主役になる。
- Stream: 列ごとの実データ。さらに「PRESENT(NULL ビット)」「DATA(値)」「LENGTH(可変長)」「SECONDARY(補助)」の 4 種類のストリームに分解される。
ファイル末尾には File Footer と PostScript があり、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 程度になることが多く、コールドデータの保管にも向く。
関連形式との比較
| 形式 | 主な戦場 | 強み | 弱み |
|---|---|---|---|
| ORC | Hive / Hadoop | ACID、Bloom Filter、高圧縮 | Hive 圏外の支援が薄め |
| Parquet | クラウド DWH / Spark / Python | 事実上の標準、エコシステム広い | 更新は不得手 |
| Avro | Kafka | スキーマ進化、行追記 | 分析は遅い |
| 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で列を指定して書き出す。
関連リンク
- 親: データベース・データ交換
- 概論: ファイル拡張子とは
- カテゴリ: データベース(カテゴリ)
- 関連する形式: Parquet(.parquet) / Avro(.avro) / Feather / Arrow IPC
- テキスト系比較: CSV(.csv)
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15