python3中pyarrow库介绍和基础使用
·
目录
一、什么是 Apache Arrow 和 PyArrow
PyArrow 是 Apache 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️⃣ 跨语言数据共享
更多推荐


所有评论(0)