当前位置:首页>python>Python 文件操作:Parquet 文件

Python 文件操作:Parquet 文件

  • 2026-09-09 05:18:23
Python 文件操作:Parquet 文件

Parquet(Apache Parquet)是一种列式存储(columnar storage)的数据文件格式,广泛应用于大规模数据分析与分布式计算系统。

与 CSV、Excel 等“行式存储”不同,Parquet 以列为单位存储数据,从而显著提升:

• 列筛选性能

• 压缩效率

• 类型安全性

• 大规模数据处理能力

它是现代数据工程体系中的核心文件格式之一。

一、Parquet 格式特点

1、列式存储结构

在 CSV 中,一行数据连续存储:

id,姓名,成绩1,张三 ,952,李四,88

在 Parquet 中,同一列数据连续存储:

id:    1,2姓名:  张三,李四成绩: 95,88

这种设计带来两个核心优势:

• 读取部分列时更快

• 压缩率更高(同类型数据连续存储)

2、主要技术特征

• 列式存储

• 强 schema 结构(列类型固定,写入数据必须符合定义)

• 支持嵌套结构(list / struct)

• 内置压缩(Snappy、Gzip 等)

• 特别适用于 GB~TB 级数据规模

3、常见应用场景

• 数据仓库(Hive / Spark)

• 数据湖(Data Lake)

• ETL 管道

• 大规模日志存储

• 机器学习特征存储

二、在 Python 中表示 Parquet 数据

Parquet 是结构化数据格式,通常以 pandas DataFrame 表示。

import pandas as pddf = pd.DataFrame({    "id": [1, 2, 3],    "姓名": ["张三", "李四", "王五"],    "成绩": [95, 88, 90]})print(df)

输出:

   id  姓名  成绩0   1  张三  951   2  李四  882   3  王五  90

DataFrame 是 Parquet 的常用逻辑表示结构。

三、使用 pandas 读写 Parquet 文件

Parquet 需要额外的后端引擎:

• pyarrow(推荐)

• fastparquet

1、安装依赖

pip install pyarrow

或:

pip install fastparquet

推荐使用 pyarrow。

2、写入 Parquet 文件

import pandas as pddf = pd.DataFrame({    "id": [1, 2, 3],    "姓名": ["张三", "李四", "王五"],    "成绩": [95, 88, 90]})df.to_parquet("students.parquet", engine="pyarrow")print("students.parquet 文件已保存。")

说明:

• 自动保存 schema

• 自动压缩,也可显式指定 compression 参数

• 保留数据类型

3、读取 Parquet 文件

df = pd.read_parquet("students.parquet", engine="pyarrow")print(df.head())

输出:

   id  姓名  成绩0   1  张三  951   2  李四  882   3  王五  90

四、列式存储带来的性能优势

1、仅读取部分列

df = pd.read_parquet("students.parquet", columns=["姓名"])print(df)

只加载指定列,而非整张表。

CSV 在物理读取阶段无法跳过列,必须解析整行数据。

2、类型保持

CSV 读取后通常为字符串,需要转换。

Parquet 会保留原始类型:

print(df.dtypes)

示例输出:

id     int64姓名    object成绩     int64dtype: object

类型安全是其重要优势。

3、压缩对比

文件类型
是否压缩
文件大小
CSV
❌
较大
Parquet
✅
更小

在数值型或重复度较高的数据中,Parquet 文件通常显著小于 CSV。

五、使用 pyarrow 进行底层操作

如果需要更底层控制,可直接使用 pyarrow。

import pyarrow as paimport pyarrow.parquet as pqdata = {    "id": [1, 2, 3],    "成绩": [95, 88, 90]}table = pa.Table.from_pydict(data)pq.write_table(table, "scores.parquet")

读取:

table = pq.read_table("scores.parquet")df = table.to_pandas()

pyarrow 更适合工程级数据处理。

六、分区存储(Partitioning)

在数据仓库场景中,Parquet 常按字段分区存储:

df["year"] = [2026, 2026, 2027]df.to_parquet(    "dataset/",    engine="pyarrow",    partition_cols=["year"])

生成目录结构:

dataset/ ├── year=2026/ └── year=2027/

分区带来的优势:

• 查询自动过滤目录

• 减少 I/O

• 提升分布式性能

七、综合案例:完整数据生命周期

流程:构造 → 写入 → 读取 → 列筛选 → 聚合 → 输出

import pandas as pd# 1. 构造数据students = [    {"id": 1, "姓名": "张三", "成绩": 95},    {"id": 2, "姓名": "李四", "成绩": 88},    {"id": 3, "姓名": "王五", "成绩": 90},    {"id": 4, "姓名": "赵六", "成绩": 70},]df = pd.DataFrame(students)# 2. 保存 Parquetdf.to_parquet("students.parquet", engine="pyarrow")# 3. 读取df2 = pd.read_parquet("students.parquet")# 4. 筛选top = df2[df2["成绩"] >= 85]# 5. 计算统计值avg = df2["成绩"].mean()print("高分学生:\n", top)print("平均分:", avg)

八、工程实践建议

1、大规模数据优先使用 Parquet。

2、保持列名与类型稳定。

3、生产环境建议启用压缩(默认 Snappy)。

4、使用分区结构优化查询。

5、不建议用于人工手动编辑。

📘 小结

Parquet 是面向分析场景的列式文件格式,具备类型安全、压缩高效与列级读取优势。Python 中通常通过 pandas + pyarrow 操作。对于大规模数据处理、数据仓库与机器学习特征存储,Parquet 是比 CSV 与 Excel 更具工程价值的选择。

“点赞有美意,赞赏是鼓励”

最新文章

随机文章