Python中的PyArrow:Apache Arrow的Python绑定,用于高效内存中数据交换

Python中的PyArrow:Apache Arrow的Python绑定,用于高效内存中数据交换

一、什么是 Apache Arrow?

Apache Arrow 是一个开源的跨语言开发平台,专注于在内存中处理列式数据。它定义了一种标准化的内存格式,使得不同系统和编程语言之间可以零拷贝地共享数据,从而极大提升数据交换的效率。

Arrow 的核心特点包括:

  • 列式内存布局:数据按列存储,适合向量化计算和分析型工作负载。
  • 语言无关性:支持 C++, Java, Python, JavaScript, Rust 等多种语言。
  • 零拷贝共享:多个进程或系统可以直接访问同一块内存中的数据,无需序列化/反序列化。
  • 高性能:避免了传统数据交换中昂贵的 I/O 和转换开销。

二、什么是 PyArrow?

PyArrow 是 Apache Arrow 在 Python 中的实现,提供了对 Arrow 内存模型的完整封装。它不仅是一个数据结构库,还是连接 Python 生态与外部系统(如 Parquet 文件、数据库、Spark、Dask 等)的桥梁。

PyArrow 的主要目标是:

  1. 提供高效的内存数据结构(如 ArrayChunkedArrayRecordBatchTable)。
  2. 支持快速读写列式存储格式(如 Parquet、Feather)。
  3. 实现与其他系统的无缝集成(如 Pandas、NumPy、Spark、Polars)。
  4. 加速数据序列化与反序列化过程。

三、PyArrow 的核心数据结构

PyArrow 定义了一系列高效的数据结构,这些结构构成了其功能的基础:

1. Array

表示一个不可变的、同类型的列数据。例如:

import pyarrow as pa arr = pa.array([1, 2, 3, None, 5]) print(arr) # 输出: [1, 2, 3, null, 5]

2. ChunkedArray

由多个 Array 组成,适用于处理大规模数据流或分块加载的数据。

3. RecordBatch

类似于一行数据的集合,常用于流式处理。它包含多个列,每列是一个 Array

batch = pa.record_batch([ pa.array(['Alice', 'Bob']), pa.array([25, 30]) ], names=['name', 'age'])

4. Table

相当于一个二维表,由多个 RecordBatch 或列组成,类似于 Pandas DataFrame,但基于 Arrow 格式。

table = pa.table({ 'name': ['Alice', 'Bob'], 'age': [25, 30], 'city': ['Beijing', 'Shanghai'] })

四、PyArrow 的主要优势

1. ⚡ 极致的性能

由于采用列式存储和零拷贝机制,PyArrow 在数据读写和转换上远超传统方法。例如,将 Pandas DataFrame 转换为 Arrow Table 几乎是零成本操作(尤其是当数据类型兼容时)。

2. 🔄 高效的序列化

PyArrow 提供了 pyarrow.serialize() 和 deserialize() 接口,支持快速对象序列化,特别适合在分布式计算框架(如 Ray、Dask)中传递复杂对象。

data = pa.serialize(my_object).to_buffer() restored = pa.deserialize(data)

3. 💾 原生支持 Parquet 和 Feather

PyArrow 可以高效读写 Parquet 和 Feather 文件格式,这两种格式都基于 Arrow 设计,具有高压缩比和快速 I/O 特性。

# 读取 Parquet 文件 table = pa.parquet.read_table('data.parquet') # 写入 Feather 文件 pa.feather.write_feather(table, 'output.feather')

4. 🧩 与 Pandas 深度集成

PyArrow 可作为 Pandas 的底层引擎使用,显著提升 DataFrame 操作性能。从 Pandas 1.4 开始,已支持使用 PyArrow 作为 dtype 后端。

# 使用 PyArrow 扩展类型 df = pd.DataFrame({'values': [1, 2, 3]}).astype('int64[pyarrow]')

5. 🌐 跨语言互操作性

通过共享内存或 IPC(进程间通信),PyArrow 可以与 Java(Spark)、R、C++ 等语言共享数据,避免重复加载和转换。


五、典型应用场景

1. 大规模数据处理流水线

在 ETL 流程中,使用 PyArrow 作为中间数据格式,可以在不同阶段(提取、转换、加载)之间高效传递数据。

2. 分布式计算框架

Dask、Ray、Vaex 等框架利用 PyArrow 实现节点间高效数据传输,减少网络和序列化开销。

3. 实时数据分析

结合 Arrow Flight 协议,PyArrow 支持高速远程数据查询服务,适用于实时 BI 场景。

4. 数据湖与云存储

与 AWS S3、Google Cloud Storage 集成,直接读取云上的 Parquet 文件,配合 DuckDB、Polars 等工具进行即席查询。


六、安装与使用

安装 PyArrow 非常简单:

pip install pyarrow

或者使用 Conda:

conda install -c conda-forge pyarrow
⚠️ 注意:建议使用 conda-forge 渠道以获得最新版本和最佳兼容性。

七、未来展望

随着数据生态对性能要求的不断提升,PyArrow 正在成为 Python 数据栈的“隐形基础设施”。越来越多的项目(如 Polars、DuckDB、Snowflake Connector)将其作为默认的数据交换层。未来,我们有望看到更多基于 Arrow 的统一数据协议和标准接口出现。


结语

PyArrow 不仅仅是一个库,更是一种现代化数据处理范式的体现。它通过标准化的内存格式、极致的性能优化和强大的生态系统整合能力,正在重塑我们处理数据的方式。无论是数据科学家、工程师还是架构师,掌握 PyArrow 都将成为提升数据系统效率的关键技能。

推荐学习路径:官方文档:https://arrow.apache.org/docs/python/实践项目:尝试用 PyArrow 替代 Pandas 的 IO 操作进阶主题:探索 Arrow Flight、Dataset API 和自定义数据源

Read more

Spatial Joy 2025 全球 AR&AI 赛事:开发者要的资源、玩法、避坑攻略都在这

Spatial Joy 2025 全球 AR&AI 赛事:开发者要的资源、玩法、避坑攻略都在这

《Spatial Joy 2025 全球 AR&AI 赛事:开发者要的资源、玩法、避坑攻略都在这》 Spatial Joy 2025 Rokid乐奇 全球 AR&AI 开发大赛 值不值得参加?不少参加过连续两届 Rokid乐奇 赛事的老兵,纷纷表示非常值得参加。 先说最实在的——奖金。 AR赛道分为应用和游戏两个赛道,金奖各20万人民币,而且是现金!交完税全是你自己的!这还不够,AR赛道总共设了27个奖项,据我打听到的往年数据,能正常跑进初赛的作品大概就60-70个,这意味着获奖比例相当高。 20万就封顶了吗?远远没有!亚马孙科技给使用Kiro并获奖的开发者,在原奖金基础上再加20%现金奖励! AI赛道同样设置了27个奖项,奖金从1万到5万不等,主要以智能体开发为主,支持市面上所有智能体平台的适配。也就是说,你之前做的智能体微调一下就能参赛! 更重要的是,现在正是智能眼镜行业爆发前夜。据我观察,

积木报表快速入门指南:零基础轻松上手数据可视化【低代码报表设计器】

积木报表快速入门指南:零基础轻松上手数据可视化【低代码报表设计器】

文章目录 * 前言 * 一、积木报表简介 * 二、环境准备 * 1. 下载积木报表 * 2. 运行环境要求 * 3. 快速启动(以Docker方式为例) * 三、第一个报表创建实战 * 1. 登录系统 * 2. 选择数据源 * 3. 设计报表 * 四、进阶功能快速上手 * 1. 图表集成 * 2. 参数传递 * 3. 分组与汇总 * 4. 导出与打印 * 五、实用技巧与最佳实践 * 1. 性能优化: * 2. 模板复用: * 3. 移动端适配: * 4. 定时任务: * 六、常见问题解答 * Q1:积木报表支持哪些数据库? * Q2:如何实现复杂的中国式报表? * Q3:能否集成到自己的系统中? * Q4:

【论文阅读】Gaussian Grouping: Segment and Edit Anything in 3D Scenes

【论文阅读】Gaussian Grouping: Segment and Edit Anything in 3D Scenes

摘要 高斯投影(Gaussian Splatting)实现了高质量、实时的三维场景新视点合成。不过,它仅专注于外观和几何建模,缺乏对细粒度的物体级场景理解。为了解决这一问题,我们提出了 Gaussian Grouping,将高斯点扩展为联合重建和分割开放世界三维场景中的任意内容。我们为每个高斯添加了一个紧凑的身份编码(Identity Encoding),使得这些高斯点能够根据其在三维场景中的物体实例或“物体/背景”的成员关系进行分组。并不依赖昂贵的三维标签,我们在可微渲染过程中通过利用 Segment Anything Model (SAM) 的二维掩码预测,以及引入的三维空间一致性正则化,对身份编码进行监督。与隐式的 NeRF 表示相比,我们表明离散且分组的三维高斯点能够在三维中以高视觉质量、细粒度和高效性来重建、分割和编辑任意内容。 引言 本文旨在构建一个 expressive 的三维场景表示,不仅对外观和几何进行建模,还捕捉场景中每个实例和物体的身份信息。我们的方法以最近的三维高斯投影(Gaussian Splatting)为基础,将其从纯粹的三维重建扩展到细粒度的场景