Parquet(Apache Parquet)是一种列式存储(columnar storage)的数据文件格式,广泛应用于大规模数据分析与分布式计算系统。
与 CSV、Excel 等“行式存储”不同,Parquet 以列为单位存储数据,从而显著提升:
• 列筛选性能
• 压缩效率
• 类型安全性
• 大规模数据处理能力
它是现代数据工程体系中的核心文件格式之一。
一、Parquet 格式特点
1、列式存储结构
在 CSV 中,一行数据连续存储:
在 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、安装依赖
或:
推荐使用 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 会保留原始类型:
示例输出:
id int64姓名 object成绩 int64dtype: object
类型安全是其重要优势。
3、压缩对比
在数值型或重复度较高的数据中,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 更具工程价值的选择。