一文带您理解Apache Parquet:高效存储和处理大数据的利器

一文带您理解Apache Parquet:高效存储和处理大数据的利器

经验文章nimo972025-01-21 10:42:1316A+A-

Apache Parquet是一种高效的列式存储格式,旨在提供在大数据处理环境中的高性能和可扩展性。它使用了一个自描述的、存储效率高的、高度可扩展的列式存储格式,以便有效地存储和处理大规模数据集。Parquet是Apache Hadoop生态系统的一部分,被广泛应用于数据分析、数据湖、机器学习、数据仓库等领域。

特征与优点

  • 存储效率高/高性能:Parquet 利用了列式存储格式的优势,能够以高效的方式存储和管理大规模数据,减少存储空间占用。由于采用了列式存储结构,Parquet 在处理查询和分析操作时表现出较高的性能,能够显著提高数据处理速度。
  • 自描述:Parquet 文件包含有关数据源和数据结构的元数据,能够帮助用户更好地理解和管理数据集。
  • 可压缩性强:Parquet 支持多种数据压缩算法,能够在保证数据完整性的前提下降低存储空间和网络传输成本。
  • 支持丰富的数据模型:支持逻辑数据模型,例如整数、浮点数、字符串等。这样的模型使得数据能够被有效地压缩和编码,同时保持结构化的特性。Parquet 支持嵌套数据类型,允许你在列中存储复杂的数据结构,比如数组、结构体等。这使得 Parquet 能够处理复杂的数据,并保持数据的层次结构。
  • 兼容性和性能:Parquet 与复杂数据良好配合,并且与许多数据处理框架(如 Hadoop 和 Spark)兼容,提高了性能。

Parquet文件格式( File Format)

详细的文件格式参考文档:https://parquet.apache.org/docs/file-format/

  • Block(HDFS块):指的是HDFS中的一个块,对于描述这种文件格式,其含义不变。该文件格式设计得能够在HDFS上良好运作。
  • 文件(File):一个必须包含文件元数据的HDFS文件。实际上,它不需要包含数据本身。
  • 行组(Row group):数据在行方向的逻辑分区。对于行组,没有保证其存在物理结构。一个行组由数据集中每个列的列块组成。
  • 列块(Column chunk):一个特定列的数据块。它们存在于特定的行组中,并且在文件中保证是连续的。
  • 页面(Page):列块被划分成页面。页面在概念上是一个不可分割的单元(就压缩和编码而言)。在一个列块中可以有多个页面类型,它们交织在一起。

从层次上看,一个文件包含一个或多个行组。一个行组包含每列恰好一个列块。列块包含一个或多个页面。

Parquet 与Python 示例1:存储和加载

python pandas 支持Parquet 格式,与csv 一下简单对比,首先我们测试存储情况:

import pandas as pd
df = pd.read_csv('results.csv')


df.to_parquet('df_test.parquet.gzip', compression='gzip')  
df.to_parquet('df_test.parquet.snappy', compression='snappy')  
df.to_parquet('df_test.parquet', compression=None)  


import os
file_size = os.path.getsize('results.csv')
print("results.csv size:",  f'{file_size:,}', "bytes")




file_size = os.path.getsize('df_test.parquet.gzip')
print("df_test.parquet.gzip size:",  f'{file_size:,}', "bytes")


file_size = os.path.getsize('df_test.parquet.snappy')
print("df_test.parquet.snappy size:",  f'{file_size:,}', "bytes")


file_size = os.path.getsize('df_test.parquet')
print("df_test.parquet size:",  f'{file_size:,}', "bytes")

parquet格式的存储于csv 减少80%,结合压缩后是csv 的 10%,可以节约90% 的空间。为数据加载测试,我们将数据放大100倍。

%time df = pd.read_csv('df_test.csv')
%time df = pd.read_parquet('df_test.parquet.gzip')
%time df = pd.read_parquet('df_test.parquet.snappy')
%time df = pd.read_parquet('df_test.parquet')

使用pandas 加载dataframe 也有大幅度提升,提升了2-3倍。

DuckDB OnParquet

DuckDB 与 Parquet 的集成是无缝的,使得轻松使用SQL进行Parquet 文件上数据进行分析、查询和统计。

DuckDB 最大的优势在于能够对庞大的数据集运行查询,无论是具有大量小文件还是一个巨大的文件。使用熟悉的 SQL 语法在个人电脑/笔记本上执行探索性数据分析(EDA)任务,为分析大量数据带来了新的视角。

select home_team    ,count(*),avg(home_score) 
from read_parquet('/home/df_test.parquet.snappy') 
group by home_team

Apache Parquet 是一种高效的列式存储格式,旨在提供大数据处理环境中的高性能和可扩展性。其特点包括高存储效率、自描述性、强大的压缩能力、支持丰富的数据模型以及与多种数据处理框架的兼容性。Parquet 格式的存储和加载速度明显优于传统的 CSV 格式,能够节约大量存储空间并提升数据处理效率,为数据分析、数据湖、机器学习等领域带来了便利与效益。

点击这里复制本文地址 以上内容由nimo97整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

尼墨宝库 © All Rights Reserved.  蜀ICP备2024111239号-7