一、什么是 Apache Arrow 和 PyArrow

PyArrowApache Arrow 在 Python 中的官方实现库。

Apache Arrow 是一个 高性能列式内存数据格式(columnar in-memory format),主要用于:

  • 高速数据分析
  • 跨语言数据交换
  • 大数据系统之间共享数据

支持语言包括:

  • Python
  • C++
  • Java
  • Rust
  • Go
  • R

因此 Arrow 常作为 数据系统之间的“通用内存格式”

很多数据框架都依赖 Arrow,例如:

  • pandas
  • Apache Spark
  • DuckDB
  • Polars
  • Dask

二、为什么 PyArrow 很重要

传统 Python 数据处理:

CSV → pandas → numpy

存在问题:

  • 内存拷贝多
  • 跨语言困难
  • 数据序列化慢

Arrow 的特点:

特性 说明
列式存储 更适合分析计算
零拷贝(zero-copy) 减少数据复制
跨语言共享 Python/C++/Java
高性能 IO Parquet / Feather

所以在 AI、大数据、数据湖 中非常常见。


三、安装 PyArrow

pip install pyarrow

或者

conda install pyarrow

验证:

import pyarrow as pa
print(pa.__version__)

四、PyArrow 核心数据结构

PyArrow 主要有三个核心结构:

Array
Table
RecordBatch

关系:

Array  -> 一列
RecordBatch -> 一批行
Table -> 多个batch组合

五、PyArrow Array(最基础)

创建 Arrow 数组:

import pyarrow as pa

arr = pa.array([1,2,3,4])
print(arr)

输出:

[
  1,
  2,
  3,
  4
]

指定类型:

arr = pa.array([1,2,3], type=pa.int64())

常见类型:

pa.int32()
pa.int64()
pa.float32()
pa.float64()
pa.string()
pa.bool_()
pa.timestamp()

六、PyArrow Table(最常用)

类似 pandas DataFrame

创建 Table

import pyarrow as pa

data = {
    "id": [1,2,3],
    "name": ["Alice","Bob","Charlie"]
}

table = pa.table(data)

print(table)

输出:

pyarrow.Table
id: int64
name: string

查看 schema

print(table.schema)

结果:

id: int64
name: string

访问列

table.column("id")

七、与 pandas 的互转

这是 最常见用途

pandas → arrow

import pandas as pd
import pyarrow as pa

df = pd.DataFrame({
    "a":[1,2,3],
    "b":[4,5,6]
})

table = pa.Table.from_pandas(df)

arrow → pandas

df = table.to_pandas()

优势:

  • 零拷贝
  • 更省内存

八、读写 Parquet 文件

Arrow 的重要能力之一是 Parquet 支持

什么是 Apache Parquet

Parquet 是一种:

  • 列式存储
  • 压缩率高
  • 适合数据分析

写 Parquet

import pyarrow.parquet as pq

pq.write_table(table, "data.parquet")

读 Parquet

table = pq.read_table("data.parquet")

转换为 pandas:

df = pq.read_table("data.parquet").to_pandas()

九、Feather 格式

另一个 Arrow 格式:

Apache Feather

特点:

  • 极快
  • 用于 Python / R 交换数据

写入:

import pyarrow.feather as feather

feather.write_feather(df, "data.feather")

读取:

df = feather.read_feather("data.feather")

十、RecordBatch

RecordBatch = 一组行

适合:

  • 流式处理
  • IPC
  • 批量计算

创建:

batch = pa.record_batch(
    [
        pa.array([1,2,3]),
        pa.array(["a","b","c"])
    ],
    names=["id","name"]
)

十一、内存映射(超高性能)

Arrow 支持 memory map

with pa.memory_map("data.arrow", "r") as source:
    reader = pa.ipc.open_file(source)
    table = reader.read_all()

优点:

  • 不加载整个文件
  • 直接访问内存

十二、典型应用场景

PyArrow 常见用途:

1 数据湖

例如:

S3
 ├── data1.parquet
 ├── data2.parquet

查询:

  • Spark
  • DuckDB
  • Pandas

2 AI / 机器学习

HuggingFace:

  • Hugging Face Datasets

底层就是 Arrow。


3 大数据交换

例如:

Python → Spark → Java

用 Arrow 共享内存。


4 高性能数据分析

配合:

  • Polars
  • DuckDB

速度远快于 pandas。


十三、一个完整示例

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

# 创建 pandas
df = pd.DataFrame({
    "id":[1,2,3],
    "score":[90,85,88]
})

# pandas -> arrow
table = pa.Table.from_pandas(df)

# 写 parquet
pq.write_table(table, "score.parquet")

# 读取 parquet
table2 = pq.read_table("score.parquet")

# arrow -> pandas
df2 = table2.to_pandas()

print(df2)

十四、PyArrow 的生态位置(非常重要)

现代数据栈:

          Spark
            │
DuckDB ── Arrow ── Pandas
            │
          Polars
            │
      HuggingFace

Arrow 是 中间层标准格式


十五、一句话总结

PyArrow = Python 访问 Apache Arrow 的接口

主要作用:

1️⃣ 高性能列式数据结构
2️⃣ Parquet / Feather 文件读写
3️⃣ Pandas 加速
4️⃣ 跨语言数据共享

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐