Python 处理 Parquet 文件详解

目录

  1. 简介
  2. Parquet 文件格式概述
  3. 使用 Python 读取和写入 Parquet
  4. Parquet 文件的常见操作
  5. 最佳实践
  6. 小结
  7. 参考资料

简介

Parquet 是一种高效的列式存储格式,广泛应用于大数据处理场景,如 Hadoop、Spark 和 Pandas。相比于 CSV 和 JSON,Parquet 提供了更高效的存储和读取性能,特别适用于大规模数据分析。

Python 提供了多种库来处理 Parquet 文件,如 pandaspyarrowfastparquet。本文将介绍 Parquet 格式的基本概念,并演示如何使用这些库高效地读取和写入 Parquet 文件。


Parquet 文件格式概述

Parquet 是 Apache 开源项目之一,具有以下特点:

  • 列式存储:相比于行式存储(如 CSV),Parquet 在列式查询、压缩和数据扫描方面有更好的性能。
  • 高效压缩:Parquet 支持多种压缩算法,如 Snappy、Gzip 和 Zstd,提高存储效率。
  • Schema 自描述:Parquet 文件包含 schema 元数据,支持复杂数据类型(如嵌套和列表)。
  • 支持分区:在大规模数据处理中,Parquet 支持按照不同列进行分区存储,提高查询效率。

使用 Python 读取和写入 Parquet

Python 处理 Parquet 主要有以下三种方式:

  1. Pandas(基于 PyArrow 或 Fastparquet)
  2. PyArrow(Apache Arrow 项目)
  3. 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")

最佳实践

  1. 优先使用 Parquet 代替 CSV:对于大规模数据分析,Parquet 读取速度更快,占用空间更少。
  2. 使用分区存储:对于大规模数据集,按特定列(如日期、类别)进行分区存储,提高查询效率。
  3. 选择合适的引擎
    • pyarrow 适用于高性能数据操作,如 Spark 兼容。
    • fastparquet 更适用于 Dask 生态,适合分布式计算。
  4. 使用 Snappy 压缩:默认情况下,Parquet 使用 Snappy 压缩,兼顾速度和压缩比:
    df.to_parquet("data_compressed.parquet", compression="snappy")
    
  5. 批量读取和处理:对于大数据集,使用 chunksizedask 进行增量处理,避免内存溢出。

小结

  • Parquet 是一种高效的列式存储格式,适用于大数据分析。
  • Python 处理 Parquet 主要依赖 pandaspyarrowfastparquet
  • 通过 Parquet 可以高效地存储、读取和操作大规模数据,并支持分区存储、压缩等特性。
  • 在大数据分析和机器学习中,推荐使用 Parquet 代替 CSV,以提升数据处理效率。

参考资料

  1. Apache Parquet 官方文档
  2. PyArrow 官方文档
  3. Pandas 官方文档
  4. Fastparquet GitHub
  5. Apache Parquet 中文文档
posted @   szz1  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示