- 数据工程
- 大数据
- 序列化
- 数据分析
【免费下载链接】arrow
Apache Arrow is a multi-language toolbox for accelerated data interchange and in-memory processing
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.rst | Arrow 格式及其相关规范与协议 |
| 开发(Development) | docs/source/developers/index.rst | 从源码构建、文档构建、贡献与代码评审、持续集成、基准测试、发布流程 |
| 实现(Implementations) | 各语言子文档 | C/GLib、C++、C#、Go、Java、JavaScript、Julia、MATLAB、nanoarrow、Python、R、Ruby、Rust 等 |
| 示例(Examples) | 各语言 Cookbook | C++、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.fbs | IPC 消息(RecordBatch 等)定义 |
| format/File.fbs | Arrow 文件(随机访问格式)定义 |
| format/Tensor.fbs、format/SparseTensor.fbs | 张量与稀疏张量定义 |
| format/Flight.proto | Flight RPC 协议(gRPC/Protobuf) |
| format/FlightSql.proto | Flight 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 规范提供了便于查阅的对照表(类型参数 + 物理布局):
| 类型 | 类型参数 | 物理内存布局 |
|---|---|---|
| Null | — | Null |
| 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 / Utf8 | — | 32 位偏移变长 Binary |
| Large Binary / Large Utf8 | — | 64 位偏移变长 Binary |
| Binary View / Utf8 View | — | 变长 Binary View |
| Fixed-Size List | value type、list size | 定长 List |
| List | value type | 32 位偏移变长 List |
| Large List | value type | 64 位偏移变长 List |
| List View / Large List View | value type | 变长 List View(偏移 + 大小) |
| Struct | children | Struct |
| Map | children、keys sortedness | Struct 的变长 List |
| Union | children、mode、type ids | Dense 或 Sparse Union |
| Dictionary | index type、value type、orderedness | Dictionary Encoded |
| Run-End Encoded | run end type、value type | Run-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/GLib | c_glib/ | docs/source/c_glib/ |
| C++ | cpp/(含 cpp/CMakeLists.txt) | docs/source/cpp/index.rst |
| C# | csharp/ | csharp/README.md |
| Go | go/ | Go 模块文档(arrow 与 parquet 子模块) |
| Java | java/ | docs/source/java/index.rst |
| JavaScript | js/ | docs/source/js/ |
| Julia | 外部仓库 | 独立站点 |
| MATLAB | matlab/ | matlab/README.md |
| nanoarrow | 外部仓库 | 独立站点 |
| Python(PyArrow) | python/ | docs/source/python/index.rst |
| R | r/ | 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++ | Java | Go | Rust | Julia |
|---|---|---|---|---|---|
| Avro | — | R | R | — | — |
| CSV | R/W | R | R/W | R/W | R/W |
| ORC | R/W | R | — | — | — |
| Parquet | R/W | R | R/W | R/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
相关推荐
Apache Arrow 项目全解析:加速内存分析的列式格式、IPC 协议与多语言参考实现
Apache Arrow 项目全解析:加速内存分析的列式格式、IPC 协议与多语言参考实现 Apache Arrow 是一个面向内存分析(in memory a
数据工程数据分析大数据Apache Arrow 技术全景指南:列式内存格式、多语言实现与官方文档导航
Apache Arrow 技术全景指南:列式内存格式、多语言实现与官方文档导航 本指南以 Apache Arrow 官方文档入口页( docs/source/i
数据工程数据分析大数据Apache Arrow Java 模块全景指南:列式内存、IPC 与 Flight 的多层实现
Apache Arrow Java 模块全景指南:列式内存、IPC 与 Flight 的多层实现 Apache Arrow 是一个面向跨语言数据交换与内存计算的
数据工程大数据序列化数据分析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考