Apache ORC 2.3.1 介绍与选型指南
Apache ORC 2.3.1 列式存储格式介绍与选型指南:文件布局与索引架构、2.3 新特性、向量化读写快速上手、适用场景及与 Parquet、Avro 的对比。
Apache ORC 2.3.1 介绍与选型指南
一、信息基准
1.1 查询说明
- 查询日期:2026-10-18
- 版本依据:ORC 官方网站发布页明示"Current Release - 2.3.1",发布日期 2026 年 7 月 16 日;官方发行目录(downloads.apache.org/orc/)同步提供 orc-2.3.1 源码工件,另含独立的 orc-format-1.1.1 规范工件。
- 软件性质:列式存储文件格式及其读写实现(Java 与 C++ 双实现),Apache 软件基金会顶级项目。
1.2 官方来源清单
| 来源 | 内容 | 地址 |
|---|---|---|
| 官方发布页 | 2.3.1 发布说明与签名 | https://orc.apache.org/releases/ |
| 官方发行目录 | orc-2.3.1 与 orc-format-1.1.1 | https://downloads.apache.org/orc/ |
| 官方文档 | 格式规范与各语言 API | https://orc.apache.org/docs/ |
| Java Core API 文档 | 快速上手示例出处 | https://orc.apache.org/docs/core-java.html |
| 源码仓库 | apache/orc | https://github.com/apache/orc |
| Maven Central | org.apache.orc 构件 | https://search.maven.org/ |
| 社区指标 | GitHub stars 徽标数据(shields.io,数据源 GitHub) | 查询日期 2026-10-18 |
1.3 版本与生态基线
| 项目 | 基线 |
|---|---|
| 本篇介绍版本 | 2.3.1(官方发布日期 2026-07-16) |
| 同期规范工件 | orc-format 1.1.1(官方发行目录) |
| 开发语言 | Java 与 C++(读写实现),格式规范语言无关 |
| 开源许可 | Apache-2.0 |
| 运行环境 | 2.3 系列新增对 Java 25 的支持(ORC-2119) |
| 社区规模 | GitHub stars 约 770(2026-10-18 查询) |
二、软件概述
2.1 项目定位
本文介绍的版本为 Apache ORC 2.3.1。ORC(Optimized Row Columnar)是一种自描述、类型感知的列式存储文件格式,面向大数据分析场景优化读取效率。按官方发布页描述,ORC 2.3.1 同时包含 Java 与 C++ 读写器,以及用于检查 ORC 文件内容与元数据的工具集。ORC 起源于 Hive 的存储格式优化,现被 Hive、Spark、Flink、Trino、Iceberg 等数据组件作为可选存储格式广泛支持。
2.2 2.3 版本要点
官方发布页列出的 2.3 新特性与显著变化包括:支持 Java 25(ORC-2119)、新增基于 lz4-java 的 Lz4Codec(ORC-2075)、支持 XerialSnappyCodec(ORC-2083)、大输入行触发 stripe 刷新(ORC-1986)、C++ 侧小 stripe 预取(ORC-2000)、stripe 预取优化(ORC-2002)与下一 stripe 的异步 I/O 预取(ORC-1969)、C++ 构建升级至 CMake 3.25+ 并采用 FetchContent(ORC-2013)。
三、核心架构
3.1 文件布局
ORC 文件由以下部分组成:文件头(魔数)、一个或多个 stripe(条带,数据主体,每条带内部再分为索引数据、行数据与条带页脚)、文件页脚(汇总各条带元数据、列统计信息与类型模式)、Postscript(记录压缩方式与页脚长度等编译期元信息)。行数据按列切分连续存储,同一列的数据聚集在一起,使分析型查询只需读取涉及的列。
3.2 三级索引与谓词下推
ORC 内建三级统计索引:文件级列统计、条带级列统计、条带内按行组(row group)的列统计(记录 min/max 等信息),并可选布隆过滤器。读取端可依统计信息跳过不满足谓词的整段数据,实现谓词下推与数据裁剪。
3.3 类型系统与压缩
- 类型系统覆盖整数、浮点、字符串/varchar/char、decimal、timestamp、date、binary 等原子类型,以及 struct、list、map、union 等复杂类型,模式在文件页脚中自描述。
- 压缩编码按列执行,支持 ZLIB、Snappy、LZ4、ZSTD 与不压缩;2.3 引入基于 lz4-java 的 Lz4Codec 与 XerialSnappyCodec 两种新编解码实现。
- 每列数据先按类型做轻量编码(字典、游程、增量、位压缩等),再整体压缩,兼顾压缩率与解压速度。
3.4 双实现与 orc-format 规范
Java 实现面向 Hive/Spark/Flink 等 JVM 数据组件;C++ 实现面向 Presto/Trino 等原生执行引擎,2.3 持续强化 C++ 侧 stripe 预取与异步 I/O。格式规范独立为 orc-format 工件(当前 1.1.1),供各语言实现对照与复用。
四、功能特性
- 高效列式扫描:按列聚集存储加三级统计索引,分析查询可跳过无关数据段。
- 向量化读写:Java Core API 以 VectorizedRowBatch(每批 1024 行)为单位读写数据,与向量化执行引擎衔接。
- 可控压缩:多种压缩算法与轻量编码按列组合,兼顾存储成本与扫描速度。
- ACID 支持:Hive 事务表以 ORC 为底层格式实现行级事务(base 与 delta 文件)。
- 工具链完善:自带检查文件内容与元数据的工具,便于诊断与校验。
- 双语言实现:Java 与 C++ 读写器由同一项目维护,跨引擎行为一致性好。
五、快速上手
以下最小写入示例引自官方 Java Core API 文档(https://orc.apache.org/docs/core-java.html),本文仅做官方示例转述,不做本地实测:
// 1. 定义模式并创建 Writer(来源:官方 core-java 文档)
Configuration conf = new Configuration();
TypeDescription schema = TypeDescription.fromString("struct<x:int,y:int>");
Writer writer = OrcFile.createWriter(new Path("my-file.orc"),
OrcFile.writerOptions(conf)
.setSchema(schema));
// 2. 以 VectorizedRowBatch 为单位填充数据并写出(来源:官方 core-java 文档)
VectorizedRowBatch batch = schema.createRowBatch();
LongColumnVector x = (LongColumnVector) batch.cols[0];
LongColumnVector y = (LongColumnVector) batch.cols[1];
for (int r = 0; r < 10000; ++r) {
int row = batch.size++;
x.vector[row] = r;
y.vector[row] = r * 3;
if (batch.size == batch.getMaxSize()) {
writer.addRowBatch(batch);
batch.reset();
}
}
if (batch.size != 0) {
writer.addRowBatch(batch);
batch.reset();
}
writer.close();
官方文档同页给出 Reader 读取与含 map 复杂类型的高级示例;Maven 坐标为 org.apache.orc(orc-core 等),完整依赖说明见官方文档与 Maven Central。
六、适用场景与限制
6.1 适用场景
- 数据仓库与湖仓的明细/汇总层存储:Hive、Spark、Flink 批处理扫描。
- 需要 Hive ACID 事务表(行级更新删除)的场景,底层固定使用 ORC。
- 关注扫描性能与存储成本、且查询具有明显列裁剪特征的分析负载。
- Iceberg 等表格式选择 ORC 作为底层文件格式的组合。
6.2 限制
- 不适合随机点查与频繁单行更新的服务型负载(列式布局天然面向扫描)。
- 与消息队列场景不匹配:小文件高频追加场景更宜使用行式格式。
- 生态覆盖上 Parquet 在 Spark 与跨语言组件中的默认地位更强,混合技术栈需统一格式时要做权衡。
- C++ 实现的功能演进(如预取优化)与 Java 实现并非逐版本完全同步,跨引擎行为需按版本核对官方发布说明。
七、同类选型对比
7.1 候选与量化对比
对比候选:Parquet、Avro。数据为 2026-10-18 联网实查,来源为 shields.io GitHub stars 徽标(数据源 GitHub)、downloads.apache.org 各自发行目录与官方网站。
| 维度 | Apache ORC 2.3.1 | Apache Parquet 1.18.1 | Apache Avro 1.12.2 |
|---|---|---|---|
| 开源许可 | Apache-2.0 | Apache-2.0 | Apache-2.0 |
| GitHub stars(2026-10-18) | 约 770 | 约 3.1k(apache/parquet-java) | 约 3.3k |
| 最近发版 | 2.3.1(官方发布页 2026-07-16) | 1.18.1(官方发行目录最新) | 1.12.2(官方发行目录最新) |
| 版本节奏 | 大版本演进中,2.x 系列持续补丁 | 稳定迭代,1.x 系列持续补丁 | 稳定迭代,1.x 系列持续补丁 |
| 存储模型 | 列式,三级统计索引,条带组织 | 列式,Dremel 式嵌套编码 | 行式,schema 内嵌与演化 |
| 实现语言 | Java + C++ 官方双实现 | Java 官方实现,C++/Rust 等多语言生态实现 | Java/C/C++/Python 等多语言官方绑定 |
| 典型生态 | Hive(含 ACID)、Spark、Flink、Trino、Iceberg | Spark 生态默认列式、Iceberg/Delta 常用 | Kafka 消息序列化、ETL 交换格式 |
7.2 选型建议
以 Hive/Spark 批分析、尤其是需要 Hive ACID 事务表为核心的数仓链路,优先选 ORC 2.3.1;若技术栈以 Spark 与跨语言嵌套数据为主则选 Parquet;消息总线与模式演化密集的流式交换场景选 Avro,三者可按"存储层列式、消息层行式"共存。
八、参考链接
- 官方发布页:https://orc.apache.org/releases/
- 官方发行目录:https://downloads.apache.org/orc/
- 官方文档首页:https://orc.apache.org/docs/
- Java Core API 文档:https://orc.apache.org/docs/core-java.html
- 源码仓库:https://github.com/apache/orc
- Maven Central:https://search.maven.org/
- stars 数据:https://img.shields.io/github/stars/apache/orc(数据源 GitHub,查询日期 2026-10-18)