Apache Arrow 技术全景指南:列式内存格式、IPC 协议与多语言实现生态
2026/9/24 5:45:09 网站建设 项目流程
  • 数据工程
  • 大数据
  • 序列化
  • 数据分析

【免费下载链接】arrow

Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing

项目地址:https://gitcode.com/gh_mirrors/arrow13/arrow
点击查看免费下载

Apache Arrow 是一个面向内存分析(in-memory analytics)的开发平台,通过一套标准化的、与语言无关的列式内存格式,让大数据系统能够高速地处理和搬运数据。本文以仓库文档站点主入口 docs/source/index.rst 为骨架,结合 列式格式规范、版本化规范、实现状态矩阵 与各语言实现文档,系统梳理 Arrow 的核心设计、格式演进、多语言实现生态与实际应用方式,帮助读者快速建立从格式到实现的完整技术地图。

项目定位:面向内存分析的计算平台

根据 docs/source/index.rst 的定义,Apache Arrow 是一个面向内存分析(in-memory analytics)的开发平台,包含一组让大数据系统能够快速处理和移动数据的技术。其核心是一套标准化的、与语言无关的列式内存格式,适用于扁平(flat)与层级(hierarchical)两类数据,并且针对现代硬件上的高效分析操作进行了专门设计。仓库根目录的 README.md 将这一目标概括为 "Powering In-Memory Analytics"。

围绕这一目标,项目集中解决与内存分析数据处理相关的系统性问题,index.rst 明确列出了三大技术主题:

  • 零拷贝共享内存与基于 RPC 的数据移动(Zero-copy shared memory and RPC-based data movement)
  • 读写各类文件格式(如 CSV、Apache ORC、Apache Parquet)
  • 内存分析与查询处理(In-memory analytics and query processing)

该文档同时是整套文档站点的导航入口,将内容划分为四个层面:

层面文档入口覆盖内容
规范(Specifications)docs/source/format/index.rstArrow 格式及其相关规范与协议
开发(Development)docs/source/developers/index.rst从源码构建、文档构建、贡献与代码评审、持续集成、基准测试、发布流程
实现(Implementations)各语言子文档C/GLib、C++、C#、Go、Java、JavaScript、Julia、MATLAB、nanoarrow、Python、R、Ruby、Rust 等
示例(Examples)各语言 CookbookC++、Java、Python、R 的实操食谱

规范层:Arrow 系列格式与协议

规范层是理解 Arrow 的起点。按照 docs/source/format/README.md 的说明,这些规范文档与 Flatbuffers / Protocol Buffers 协议定义文件配套使用,共同提供足以从零构建一个新 Arrow 实现的细节。规范文档位于 docs/source/format/index.rst,包含以下主题:

  • Versioning:格式版本化与稳定性保证(Versioning.rst)
  • Columnar:列式内存格式规范(Columnar.rst)
  • CanonicalExtensions:规范扩展类型(如 fixed shape tensor、variable shape tensor)
  • Other:其他数据布局规范
  • CDataInterface / CStreamInterface / CDeviceDataInterface:C 语言层面的数据与流接口(供各语言零拷贝互操作)
  • DissociatedIPC:解耦式 IPC 变体
  • Flight / FlightSql:Flight RPC 协议与 SQL 扩展
  • ADBC:Arrow Database Connectivity 规范
  • Changing:格式变更流程
  • Integration:跨语言实现的一致性集成测试规范
  • Glossary:术语表

对应的机器可读协议定义文件位于仓库根目录 format/ 下,与规范文档一一对应:

文件作用
format/Schema.fbs内置数据类型定义
format/Message.fbsIPC 消息(RecordBatch 等)定义
format/File.fbsArrow 文件(随机访问格式)定义
format/Tensor.fbs、format/SparseTensor.fbs张量与稀疏张量定义
format/Flight.protoFlight RPC 协议(gRPC/Protobuf)
format/FlightSql.protoFlight SQL 协议

核心:列式内存格式(Columnar Format)

列式内存格式是整个 Arrow 生态的基石。根据 Columnar.rst(当前规范版本 1.4),该格式包含三部分:与语言无关的内存数据结构规范元数据序列化,以及序列化与通用数据传输协议。元数据序列化采用 Google Flatbuffers,因此实现者需要同时参考 Flatbuffers 协议定义文件(即上文的.fbs文件)。

设计目标与关键特性

Columnar 规范明确给出了格式的核心特性,这些特性决定了它在现代硬件上的分析性能:

  • 数据相邻(Data adjacency for sequential access):同一列的数据在内存中连续存放,天然适配顺序扫描(scans);
  • O(1) 常量时间随机访问:任意 slot 可在常量时间内定位;
  • SIMD 与向量化友好:连续的同构数据可直接交给 SIMD 指令处理;
  • 无需"指针改写"即可重定位(Relocatable without "pointer swizzling"):这意味着数据可以直接在共享内存中实现真正的零拷贝访问

作为交换,列式布局在可变(mutation)操作上相对更昂贵。规范文档只关注内存表示与序列化细节,数据结构变更的协调问题交由各语言实现自行处理。

核心术语

由于不同项目对同一概念用词不一,规范提供了一个小型术语表,这也是阅读后续各语言文档的通用语言:

  • Array / Vector:已知长度的、所有元素同类型的值序列,两种叫法在不同实现中混用;
  • Slot:数组中某个特定数据类型下的单个逻辑值;
  • Buffer / 连续内存区域:给定长度的连续虚拟地址空间,任何字节都可通过一个小于区域长度的指针偏移访问;
  • Physical Layout:不考虑值语义的底层内存布局(例如 32 位有符号整数与 32 位浮点数组的布局相同);
  • Data type:基于某种物理布局实现的、面向应用的语义值类型(如 Decimal128 以 16 字节存储在定长二进制布局中);
  • Primitive type:没有子类型的类型,包括定长位宽、变长二进制和 null 类型;
  • Nested type:结构依赖一个或多个子类型的类型,两个嵌套类型相等当且仅当子类型相等(List<U>List<V>不同当且仅当 U、V 不同);
  • Parent / child arrays:描述嵌套类型结构中物理值数组间的关系(如List<T>父数组以 T 类型数组为子);
  • Parametric type:需要额外参数才能完整确定语义的类型(所有嵌套类型、以及需要单位与时区的 Timestamp)。

数据类型全览

format/Schema.fbs 是标准 Arrow 数据类型的权威定义来源,Columnar 规范提供了便于查阅的对照表(类型参数 + 物理布局):

类型类型参数物理内存布局
NullNull
Boolean定长 Primitive
Int位宽、有符号性定长 Primitive
Floating Point精度定长 Primitive
Decimal位宽、scale、precision定长 Primitive
Date单位定长 Primitive
Time位宽、单位定长 Primitive
Timestamp单位、时区定长 Primitive
Interval / Duration单位定长 Primitive
Fixed-Size Binary字节宽定长 Binary
Binary / Utf832 位偏移变长 Binary
Large Binary / Large Utf864 位偏移变长 Binary
Binary View / Utf8 View变长 Binary View
Fixed-Size Listvalue type、list size定长 List
Listvalue type32 位偏移变长 List
Large Listvalue type64 位偏移变长 List
List View / Large List Viewvalue type变长 List View(偏移 + 大小)
StructchildrenStruct
Mapchildren、keys sortednessStruct 的变长 List
Unionchildren、mode、type idsDense 或 Sparse Union
Dictionaryindex type、value type、orderednessDictionary Encoded
Run-End Encodedrun end type、value typeRun-End Encoded

几点需要注意:Time 类型的位宽参数在技术上冗余(每个单位强制对应一种位宽);Union 的 Sparse/Dense 布局由 mode 参数决定;Dictionary 的 index type 只能是 8~64 位的整数类型(最好有符号);Run-End Encoded 的 run end type 只能是 16~64 位有符号整数。

此外,规范特别指出:Arrow 的类型系统不像 Parquet 那样区分物理类型与逻辑类型("logical type" 一词仅用于强调语义区分),同时通过**扩展类型(Extension types)**机制允许在标准类型之上注解更丰富的应用语义(例如在 String 之上定义 "JSON" 类型)。

格式版本化与兼容性保证

格式的稳定性直接决定了各语言实现能否互操作。根据 Versioning.rst,自 1.0.0 起,项目使用两个版本号描述每次发布:格式版本(Format Version)库版本(Library Version)。每个库版本对应一个格式版本,且多个库版本可对应同一格式版本(例如库版本 2.0.0 与 3.0.0 可能都跟踪格式版本 1.0.0)。1.0.0 之前的大版本可能包含 API 变更;自 1.0.0 起,库版本遵循语义化版本(Semantic Versioning)约定。

三类兼容性承诺

  • 向后兼容(Backward Compatibility):只要格式的 major 版本不变,新版本的库可以读取旧库产生的任何数据与元数据;
  • 向前兼容(Forward Compatibility):旧库要么能读取新库生成的数据,要么能检测出无法正确读取。格式 minor 版本提升(如 1.0.0 → 1.1.0)表示新特性加入,只要不使用这些新特性(如新数据类型),向前兼容性即可保持;
  • 长期稳定(Long-Term Stability):格式 major 版本变更(如 1.0.0 → 2.0.0)意味着兼容性保证被打破,但项目明确表示预期这种情况不会频繁发生,且会谨慎处理以保障生产应用不受损害。

1.0.0 之后的格式演进

1.0.0 之前不提供前向/后向兼容保证,但项目尽力保证新客户端可读取 0.8.0 及之后库版本产出的序列化数据。自 1.0.0 以来,格式共经历了4 个 minor 版本、0 个 major 版本,每次 minor 版本新增功能(不使用新功能时均与 1.0.0 兼容):

  • 版本 1.1:新增 256 位 Decimal 类型(Decimal256);
  • 版本 1.2:新增 MonthDayNano 间隔(interval)类型;
  • 版本 1.3:新增 Run-End Encoded 布局;
  • 版本 1.4:新增变长 Binary View 布局及 BinaryView/Utf8View 类型、ListView/LargeListView 布局与类型,以及变长缓冲区(variadic buffers)支持。

这也解释了 status.rst 中"所有库当前均遵循 Arrow 格式 1.0.0 或与其兼容的后续 minor 版本"的表述。

IPC 与零拷贝数据移动

零拷贝数据移动是 Arrow 的核心价值之一。仓库 README.md 将Arrow IPC 格式定义为 Arrow 格式及相关元数据的高效序列化方案,用于进程间通信(IPC)与异构环境间通信,并提供了两种自描述的二进制线格式:

  • Arrow stream format(流格式):面向流式处理,可边序列化边消费;
  • Arrow file format(文件格式):面向随机访问的批量/文件格式。

根据 status.rst 的 IPC 特性矩阵,主流实现(C++、Java、Go、JS、C#、Rust、Julia、Swift、nanoarrow)在流格式、文件格式、Record Batches、字典(Dictionaries)、自定义 schema 元数据等项目上普遍达成全覆盖;而张量(Tensors)与稀疏张量(Sparse tensors)目前仅 C++ 支持。此外,缓冲区压缩(Buffer compression)与端序转换(读取时自动字节交换非本机端序数据)在多数实现中可用,其中 C++ 的 LZ4 codec 性能问题由 ARROW-11901 跟踪改进。

Flight RPC 与 Flight SQL

在 IPC 之上,Arrow Flight RPC 协议(format/Flight.proto)提供了远程服务交换 Arrow 数据的构建块——一个基于 Arrow IPC 格式、语义由应用自定义(如存储服务器或数据库)的 RPC 框架。根据 status.rst:

  • gRPC 传输grpc:grpc+tcp:grpc+unix:grpc+tls:)在 C++、Java、Go、C#、Rust 中可用,支持全部 RPC 方法、认证处理器、调用超时、调用取消、并发客户端调用、自定义中间件与 RPC 错误码;
  • UCX 传输ucx:)目前仅 C++ 支持,且只支持 DoExchange、DoGet、DoPut、GetFlightInfo 四个方法;并发调用时每个调用独占一条连接(不同于 gRPC 的单一连接多路复用),通常吞吐更高但客户端与服务端资源消耗更大。

Flight SQL(format/FlightSql.proto)在 status.rst 中被明确标注为仍处于实验阶段,其特性覆盖指客户端/服务端库本身,具体数据库对协议各特性的支持由各实现决定。当前 C++ 与 Java 覆盖度最高(含 BeginTransaction、PreparedStatement、GetSqlInfo、StatementSubstraitPlan 等),Go、C#、Rust 覆盖常用查询与元数据接口。

多语言实现生态

index.rst 的 Implementations 部分给出了完整的官方实现清单,各实现均可在本仓库中找到对应源码目录与文档入口:

语言仓库目录文档入口
C/GLibc_glib/docs/source/c_glib/
C++cpp/(含 cpp/CMakeLists.txt)docs/source/cpp/index.rst
C#csharp/csharp/README.md
Gogo/Go 模块文档(arrow 与 parquet 子模块)
Javajava/docs/source/java/index.rst
JavaScriptjs/docs/source/js/
Julia外部仓库独立站点
MATLABmatlab/matlab/README.md
nanoarrow外部仓库独立站点
Python(PyArrow)python/docs/source/python/index.rst
Rr/docs/source/r/
Ruby(Red Arrow)ruby/ruby/README.md
Rust外部仓库(arrow-rs)Rust 文档

几个值得注意的实现特点(均有仓库文档佐证):

  • Python(PyArrow):基于 C++ 实现构建的绑定层,与 NumPy、pandas 及 Python 内建对象拥有一等集成,这也是 PyArrow 成为数据科学生态事实标准的重要原因(python/index.rst);
  • Java:提供完整的独立实现,涵盖 memory、vector、table、IPC、algorithm、Flight、Flight SQL、Dataset、Substrait、C Data Interface、JDBC 等模块(java/index.rst);
  • C++:功能最全面的参考实现,文档分为 Getting started、User Guide、Examples 与 API Reference 四大部分(cpp/index.rst);
  • 按 status.rst 的说明,Python、R、Ruby 与 C/GLib 库均跟随 C++ Arrow 库的能力集,因此这些绑定层的功能覆盖可参照 C++ 的状态矩阵。

实现状态矩阵:功能覆盖一目了然

status.rst 是判断"某个库是否支持某个特性"的权威依据,覆盖以下维度:

  • 数据类型:基础类型(Null、Boolean、Int8/16/32/64、UInt、Float16/32/64、Decimal128/256、Date32/64、Time32/64、Timestamp、Duration、Interval、各类 Binary/Utf8 及 View 变体)与嵌套类型(Fixed-Size List、List、Large List、List View、Struct、Map、Dense/Sparse Union)在 C++、Java、Go、JS、C#、Rust、Julia、Swift、nanoarrow 中普遍 ✓;较新的 View 系列与 Run-End Encoded 目前仅 C++ 与 Go 等少数实现支持;
  • IPC 格式:流格式、文件格式、Record Batches、字典、缓冲区压缩、端序转换、自定义 schema 元数据等;
  • Flight RPC:gRPC 与 UCX 两种传输的详细特性矩阵;
  • Flight SQL:20 余项接口在各实现中的覆盖情况;
  • C Data / C Stream Interface:Schema/Array 的导出与导入,Python、R、Rust、Go、Java、C/GLib、Ruby、C#、nanoarrow 均支持;
  • 第三方数据格式:详见下文。

矩阵中特别标注的注意事项包括:Java 不支持 Float16 的 cast 转换;C# 的 Float16 仅在 .NET 6+ 可用;C++/Rust 的字典类型不支持嵌套字典;Java 的 ORC/Parquet 读取通过 JNI 绑定到 C++ 实现完成。

第三方文件格式读写能力

index.rst 将"读取和写入文件格式(如 CSV、Apache ORC、Apache Parquet)"列为项目的三大主题之一,status.rst 的"Third-Party Data Formats"矩阵给出了各实现的读写能力(R = 读、W = 写):

格式C++JavaGoRustJulia
AvroRR
CSVR/WRR/WR/WR/W
ORCR/WR
ParquetR/WRR/WR/W

其中 Java 对 CSV 与 Parquet 的读取通过 JNI 绑定到 Arrow C++ Datasets 实现(由org.apache.arrow:arrow-dataset提供),ORC 读取则通过org.apache.arrow.orc:arrow-orcJNI 绑定。此外,C++ 还提供 CSV/JSON/ORC/Parquet/Feather 等格式的读写器(参见 python/README.md 对 pyarrow 各子模块的说明)。

开发、构建与贡献

对于希望参与开发或从源码构建的用户,docs/source/developers/index.rst 是入口文档,主要内容包括:

  • 各语言开发指南:C++(docs/source/cpp/ 下的 development 与 building 文档)、Java(docs/source/java/index.rst)、Python(docs/source/python/ 的 python-development 章节)、R、Ruby;
  • 贡献指南(Contributing to Apache Arrow):所有参与均受 ASF 行为准则约束;从加入邮件列表、报告 bug、改进文档,到新贡献者指南、贡献概览与代码评审流程;
  • 持续集成:需要覆盖不同的包管理器、编译器、软件库版本、操作系统等组合(参见 ci/ 下的 docker 与 scripts 脚本);
  • 基准测试:如何使用基准测试套件;
  • 发布流程与发布验证:详尽的发布步骤与验证流程文档。

各实现的构建入口均可从仓库顶层目录找到,例如 C++ 的 cpp/CMakeLists.txt 与 CMake 预设(cpp/CMakePresets.json)、C/GLib 的 c_glib/README.md、Python 的 python/README.md 与 python/setup.py。仓库中还有完整的集成测试体系(如 format/Integration.rst 定义的跨语言二进制兼容性验证,例如从 Java 发送数据到 C++)。

示例与 Cookbook

index.rst 的 Examples 部分提供了面向实操的示例资源:C++、Java、Python、R 四种语言的 Cookbook 合集,覆盖各种常见任务(如读取 Parquet、列式计算、与 pandas 互操作等)。仓库内也包含可直接运行的示例代码,例如 cpp/examples/(C++ 示例,含构建说明)、c_glib/example/(C/GLib 的 C 与 Vala 示例)、python/examples/,以及 r/vignettes/ 中的 R 教程文档。这些示例与各语言文档配合,可以快速上手从内存数组构建、IPC 传输到文件读写的完整链路。

结语:从文档入口到技术全景

docs/source/index.rst虽然只是一页索引,但它精准地刻画了 Apache Arrow 的定位:以标准化的列式内存格式为内核,以 IPC/Flight 实现零拷贝数据移动,以覆盖十余种语言的实现矩阵兑现"一处格式、处处互通"的承诺。顺着本文梳理的规范层(format/index.rst)、状态层(status.rst)、实现层(各语言文档)与开发层(developers/index.rst)四个维度,读者可以在仓库内快速定位到任何所需的技术细节,无论是阅读格式规范、核对特性支持,还是动手构建与贡献代码。

  • 数据工程
  • 大数据
  • 序列化
  • 数据分析

【免费下载链接】arrow

Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing

项目地址:https://gitcode.com/gh_mirrors/arrow13/arrow
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询