Apache ORC 2.3.1 介绍与选型指南

Apache ORC 2.3.1 列式存储格式介绍与选型指南:文件布局与索引架构、2.3 新特性、向量化读写快速上手、适用场景及与 Parquet、Avro 的对比。

Apache ORCApache ORCORC表格式/元数据2026/10/18

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.1https://downloads.apache.org/orc/
官方文档格式规范与各语言 APIhttps://orc.apache.org/docs/
Java Core API 文档快速上手示例出处https://orc.apache.org/docs/core-java.html
源码仓库apache/orchttps://github.com/apache/orc
Maven Centralorg.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.1Apache Parquet 1.18.1Apache Avro 1.12.2
开源许可Apache-2.0Apache-2.0Apache-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、IcebergSpark 生态默认列式、Iceberg/Delta 常用Kafka 消息序列化、ETL 交换格式

7.2 选型建议

以 Hive/Spark 批分析、尤其是需要 Hive ACID 事务表为核心的数仓链路,优先选 ORC 2.3.1;若技术栈以 Spark 与跨语言嵌套数据为主则选 Parquet;消息总线与模式演化密集的流式交换场景选 Avro,三者可按"存储层列式、消息层行式"共存。

八、参考链接