Parquet使用指南:一个超越CSV、提升数据处理效率的存储格式

在这里插入图片描述

前言

在大数据时代,数据存储和处理的效率越来越重要。同时,我们在工作中处理的数据也越来越多,从excel格式到csv格式,从文件文档传输到直接从数据库提取,数据单位也从K到M再到G。

当数据量达到了G以上,几G甚至几十G,在使用python时就能察觉到数据处理效率在变慢。在这种情况下有什么更好的解决方法吗?

什么是Parquet?

Parquet是一种开源的列式存储数据文件格式,旨在高效存储和检索数据。它提供了高效的数据压缩和编码方案,能够处理大量复杂数据。同时,支持多种编程语言。Parquet被设计为批处理和交互工作负载的通用交换格式,类似于Hadoop中的其他列式存储格式,如RCFile和ORC。

Parquet与CSV的比较

与简单的CSV格式相比,Parquet在存储和处理大数据集时具有明显优势:

  • 存储效率:Parquet在云存储上的需求比CSV小得多。
  • 查询性能:Parquet的查询速度远高于CSV,特别是在处理大数据时。
  • 成本节约:使用Parquet可以大幅降低存储和数据扫描成本。
数据集Amazon S3大小查询时间数据扫描量成本
CSV格式数据1 TB236秒1.15 TB$5.75
Parquet格式数据130 GB6.78秒2.51 GB$0.01
节省87%34倍更快99%99.7%

Parquet的优势

  • 适用于各种大数据存储:适用于存储各种类型的大数据(结构化数据表、图像、视频、文档)。
  • 节省云存储空间:通过高效的列式压缩和灵活的编码方案,显著节省云存储空间。
  • 提高数据吞吐量和性能:使用数据跳过等技术,只读取需要的列,减少I/O,提升查询性能。
  • 优化复杂数据处理:支持复杂数据结构,适合处理大批量数据,提供高效的数据压缩和编码。

列式存储的优势

  • 查询效率:与行式存储(如CSV)相比,列式存储可以快速跳过无关数据,显著减少聚合查询时间。
  • 压缩效率:列式存储支持灵活的压缩选项和高效编码方案,使查询更快,数据压缩更高效。不同的数据文件可以以不同的方式压缩。
  • 支持复杂查询:Apache Parquet是从底层构建的,支持高级嵌套数据结构,优化大型数据处理,特别是处理GB级别数据文件的查询。
  • 兼容多种技术:适用于AWS Athena、Amazon Redshift Spectrum、Google BigQuery等交互和无服务器技术。

应用场景

  1. 大数据处理:Parquet格式在大数据处理和分析场景中非常流行,特别是在使用Apache Spark和Hadoop等工具时。
  2. 数据仓库:由于其高效的存储和读取性能,Parquet常用于数据仓库中,以支持快速的查询和分析。
  3. 数据传输和存储:Parquet格式非常适合用作长期数据存储格式,同时也便于在不同系统之间传输。

Parquet用法介绍

安装必要的库

首先,需要安装Pandas和PyArrow库。如果尚未安装,可以使用以下命令安装:

pip install pandas
pip install pyarrow

创建和读取Parquet文件(df转Parquet)

以下是一个简单的示例,把一个Dataframe写入Parquet文件中:

import pandas as pd

# 创建数据
data = {
    'A': [1, 2, 3, 4, 5],
    'B': ['a', 'b', 'c', 'd', 'e'],
    'C': [1.1, 2.2, 3.3, 4.4, 5.5]
}
df = pd.DataFrame(data)

# 写入parquet文件
df.to_parquet('data.parquet', engine='pyarrow')

此时会生成一个名为data.parquet的文件。

# 读取parquet文件
df = pd.read_parquet('data.parquet', engine='pyarrow')

# 打印前五行数据
print(df.head())

读取CSV并转换为Parquet

以下是一个简单的示例代码,演示如何将CSV文件转换为Parquet格式:

import pandas as pd

# 读取CSV文件
csv_file_path = 'data.csv'
df = pd.read_csv(csv_file_path)

# 将数据写入Parquet格式
parquet_file_path = 'data.parquet'
df.to_parquet(parquet_file_path, engine='pyarrow')

在上述代码中,我们首先使用pd.read_csv函数读取CSV文件,然后使用df.to_parquet函数将DataFrame保存为Parquet格式文件。

将大型CSV文件转换成Parquet格式

这个脚本的工作流程如下:

  1. 使用 pandas.read_csv 逐块读取CSV文件,块大小由 chunksize 参数决定。
  2. 将每块数据转换为Apache Arrow的Table。
  3. 使用 ParquetWriter 将每块数据写入Parquet文件。
import pandas as pd 
import pyarrow as pa 
import pyarrow.parquet as pq

# 定义读取CSV文件的块大小
chunksize = 10**6  # 每次读取100万行

csv_file = 'data.csv'
parquet_file = 'large_file.parquet'

# 使用pandas逐块读取CSV文件
reader = pd.read_csv(csv_file, chunksize=chunksize)

# 读取第一块数据以确定schema
first_chunk = next(reader)
table = pa.Table.from_pandas(first_chunk)

# 打开一个新的Parquet文件以写入,并设置schema
with pq.ParquetWriter(parquet_file, table.schema) as writer:
    writer.write_table(table)
    
    # 继续处理剩余的块
    for i, chunk in enumerate(reader, start=1):
        print(f'Processing chunk {i}...')
        table = pa.Table.from_pandas(chunk)
        writer.write_table(table)

print('CSV to Parquet conversion completed.')

注意:根据具体情况调整 chunksize 的大小,以平衡内存使用和I/O性能。

总结

通过使用Pandas和PyArrow等库,可以方便地将CSV文件转换为Parquet格式,并读取Parquet文件以进行数据操作。特别是在大规模数据分析和存储的应用中,了解和使用Parquet格式可以显著提高数据处理的效率和性能。

参考链接

在这里插入图片描述

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值