定义
Apache Arrow包含一个标准化的、与语言无关的列式内存格式规范,用来在内存中表示结构化的、表状的数据集,其数据类型系统涵盖嵌套类型和用户定义类型,面向分析型数据库系统、数据框库等场景的需求[2]。除格式规范外,该项目还提供多种语言的官方实现,以及把这些数据读写为常见存储格式的工具,使第三方项目不必自行实现该格式即可使用Arrow数据[2]。
在Arrow的术语里,每一列称为一个数组,数组的值如何在内存中排列由物理内存布局规范定义,存放数组数据的连续内存区域称为缓冲区,一个数组由一个或多个缓冲区组成[3]。该格式和协议被认为是稳定的,项目计划只做向后兼容的改动,例如新增数据类型[2]。
原理
表格数据在内存中既可按行存储也可按列存储。行式格式中同一行的数据在内存里彼此相邻;列式格式则按列组织数据。列式布局利用内存局部性,让过滤、分组、聚合等分析操作更高效,因为处理过程中处理器访问的内存位置往往相互靠近[3]。连续排列的数据还使计算得以向量化,现代处理器大多具有单指令多数据指令,可以在一条指令中同时处理多个值[3]。
在物理布局上,定长原始类型(如有符号与无符号整数、浮点数、布尔值、十进制和时间类型)的每个值占用相同的字节数;布尔值以位而非字节编码[3]。变长布局用于二进制和字符串,所有元素的字节连续存放在同一块缓冲区中,另有一个整数偏移量缓冲区记录每个元素的起止位置,偏移量缓冲区的长度总比数组多一个元素;偏移量采用32位时单个数组最大为2GB,采用64位的大变体则不受此限制[3]。
对于缺失值,Arrow对所有数据类型都支持空值,并借助一个可选的专用缓冲区即有效性位图来标记每个值是否为空:位值为1表示非空,为0表示为空;若数组中不含缺失值则无需分配该缓冲区[3]。社区还用「$ \text{有效位图} + \text{偏移量缓冲} + \text{值缓冲} $」这组结构概括部分布局的组成方式。
发展历程
该项目于2016年2月5日正式成立并产生首次代码提交,最初的构想是解决互操作性问题的另一半,作为磁盘持久化格式 Apache Parquet 在内存侧的天然补充;其内存列式结构的思路可追溯到 Apache Drill 项目。第一个版本0.1.0于2016年10月7日发布,当时已包含后来大多数数据集常用的主要数据类型。
0.1.0版本只有C++和Java两种实现,前者还带有面向Python的绑定,当时不存在跨实现一致性的自动化检验;跨语言集成测试到2016年11月才开始设计,第一次自动化持续集成运行大约发生在同年12月。此后集成测试随格式的扩充而发展,并保证旧数据仍可被读取。
自2016年以来,列式格式在多数情况下只是新增数据类型,唯一一次破坏性改动是联合类型不再拥有顶层有效性位图,该改动于2020年6月提出并很快实施,之后列式格式与IPC格式没有再出现破坏性改动。項目在版本编号上相当谨慎,直到2020年7月才脱离0.x版本号,发布1.0.0,正式作出兼容性承诺。
应用
由于统一的内存布局,使用或支持Arrow的系统之间可以以极低的成本传递数据,跨语言调用也无需为序列化付出开销,例如Java应用可以对源自JVM的数据调用C或C++算法[2]。官方库覆盖C++、.NET、Go、Java、JavaScript、Julia、Rust和Swift等语言,C、Python、R和Ruby的库则构建在C++库之上,各实现之间通过集成测试相互校验以确认对格式的忠实实现[1]。
Arrow与磁盘列式格式互补而非替代。以Parquet为例,数据以Parquet存于磁盘、再以Arrow读入内存,可以同时利用前者的空间效率和后者便于计算的内存布局[2]。除数据访问与输入输出相关的组件外,项目还包含针对Arrow数据集执行分析操作或查询的算法库[2]。
局限
Arrow主要面向计算,其数据通常不压缩,而是按适合处理器的自然格式布局,以便在任意位置全速访问,这与以空间效率优先的Parquet形成取向差异;Arrow也提供字典编码、游程编码和缓冲区压缩等有限的空间优化选项[2]。项目官方并不推荐把Arrow文件格式用于数据的长期磁盘持久化,认为把Arrow内存写入磁盘更适合内存映射和缓存这类用途[4]。
与Parquet等文件格式相比,Arrow协议在磁盘上的体积通常更大,读取成本也更低,因为后者可以直接内存映射而无需解码,所以在磁盘存储或网络较慢时Parquet可能是更好的选择[4]。此外,Arrow模式支持嵌套结构、映射和联合类型,但生态系统中并非所有组件都完整支持这些类型,例如联合类型不能直接转换为Parquet,需要经过转换步骤;Arrow模式也不支持递归定义的模式,其嵌套深度必须事先确定[5]。
参见
-
Apache Parquet —— 面向磁盘存储的列式文件格式,与Arrow互为补充,常在应用中配合使用。
-
Apache Drill —— Arrow内存列式结构的思路来源之一。
-
Apache 软件基金会 —— Arrow所属的开源组织。
-
SIMD —— 单指令多数据指令,Arrow的列式布局可借助它实现向量化处理。
-
零拷贝 —— Arrow实现进程间共享数据、避免序列化开销的关键机制。
参考资料
- 格式 | Apache Arrow [引用日期2026-10-14]
- 常见问题解答 [引用日期2026-10-14]
- 简介 — Apache Arrow v24.0.0 [引用日期2026-10-14]
- faq [引用日期2026-10-14]
- Our journey at F5 with Apache Arrow (part 1) [引用日期2026-10-14]