Python 处理 Parquet 文件详解
目录
简介
Parquet 是一种高效的列式存储格式,广泛应用于大数据处理场景,如 Hadoop、Spark 和 Pandas。相比于 CSV 和 JSON,Parquet 提供了更高效的存储和读取性能,特别适用于大规模数据分析。
Python 提供了多种库来处理 Parquet 文件,如 pandas
、pyarrow
和 fastparquet
。本文将介绍 Parquet 格式的基本概念,并演示如何使用这些库高效地读取和写入 Parquet 文件。
Parquet 文件格式概述
Parquet 是 Apache 开源项目之一,具有以下特点:
- 列式存储:相比于行式存储(如 CSV),Parquet 在列式查询、压缩和数据扫描方面有更好的性能。
- 高效压缩:Parquet 支持多种压缩算法,如 Snappy、Gzip 和 Zstd,提高存储效率。
- Schema 自描述:Parquet 文件包含 schema 元数据,支持复杂数据类型(如嵌套和列表)。
- 支持分区:在大规模数据处理中,Parquet 支持按照不同列进行分区存储,提高查询效率。
使用 Python 读取和写入 Parquet
Python 处理 Parquet 主要有以下三种方式:
- Pandas(基于 PyArrow 或 Fastparquet)
- PyArrow(Apache Arrow 项目)
- Fastparquet(Dask 生态系统)
使用 Pandas 读取和写入
Pandas 本身提供了对 Parquet 的支持,默认使用 pyarrow
作为后端,也可以选择 fastparquet
。
安装依赖
pip install pandas pyarrow fastparquet
写入 Parquet
import pandas as pd
# 创建一个 DataFrame
df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"score": [85.5, 92.3, 88.0]
})
# 保存为 Parquet 格式
df.to_parquet("data.parquet", engine="pyarrow") # 或 engine="fastparquet"
读取 Parquet
df_read = pd.read_parquet("data.parquet", engine="pyarrow")
print(df_read)
使用 PyArrow 读取和写入
pyarrow
是 Apache Arrow 生态系统的一部分,提供了强大的 Parquet 支持。
写入 Parquet
import pyarrow as pa
import pyarrow.parquet as pq
# 创建一个 Arrow Table
table = pa.table({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"score": [85.5, 92.3, 88.0]
})
# 保存为 Parquet 文件
pq.write_table(table, "data_arrow.parquet")
读取 Parquet
table_read = pq.read_table("data_arrow.parquet")
df = table_read.to_pandas()
print(df)
使用 Fastparquet 读取和写入
fastparquet
是 Pandas 和 Dask 生态系统的一部分,专注于高效处理 Parquet。
写入 Parquet
import fastparquet
df.to_parquet("data_fastparquet.parquet", engine="fastparquet")
读取 Parquet
df_read = pd.read_parquet("data_fastparquet.parquet", engine="fastparquet")
print(df_read)
Parquet 文件的常见操作
读取指定列
如果数据集较大,只读取部分列可以提高性能:
df_selected = pd.read_parquet("data.parquet", columns=["name", "age"])
print(df_selected)
分区写入和读取
Parquet 允许按列分区存储,提高查询效率。例如,按 age
列进行分区:
df.to_parquet("partitioned_data", partition_cols=["age"], engine="pyarrow")
读取时,Pandas 会自动识别分区:
df_partitioned = pd.read_parquet("partitioned_data")
print(df_partitioned)
合并多个 Parquet 文件
如果有多个 Parquet 文件,可以使用 PyArrow 进行合并:
import glob
# 读取所有 Parquet 文件
parquet_files = glob.glob("partitioned_data/*.parquet")
# 合并文件
tables = [pq.read_table(f) for f in parquet_files]
merged_table = pa.concat_tables(tables)
# 保存合并后的文件
pq.write_table(merged_table, "merged_data.parquet")
转换 CSV/JSON 到 Parquet
将 CSV 转换为 Parquet:
df_csv = pd.read_csv("data.csv")
df_csv.to_parquet("data_from_csv.parquet")
将 JSON 转换为 Parquet:
df_json = pd.read_json("data.json")
df_json.to_parquet("data_from_json.parquet")
最佳实践
- 优先使用 Parquet 代替 CSV:对于大规模数据分析,Parquet 读取速度更快,占用空间更少。
- 使用分区存储:对于大规模数据集,按特定列(如日期、类别)进行分区存储,提高查询效率。
- 选择合适的引擎:
pyarrow
适用于高性能数据操作,如 Spark 兼容。fastparquet
更适用于 Dask 生态,适合分布式计算。
- 使用 Snappy 压缩:默认情况下,Parquet 使用 Snappy 压缩,兼顾速度和压缩比:
df.to_parquet("data_compressed.parquet", compression="snappy")
- 批量读取和处理:对于大数据集,使用
chunksize
或dask
进行增量处理,避免内存溢出。
小结
- Parquet 是一种高效的列式存储格式,适用于大数据分析。
- Python 处理 Parquet 主要依赖
pandas
、pyarrow
和fastparquet
。 - 通过 Parquet 可以高效地存储、读取和操作大规模数据,并支持分区存储、压缩等特性。
- 在大数据分析和机器学习中,推荐使用 Parquet 代替 CSV,以提升数据处理效率。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?