Parquet文件格式解析

Parquet是一种广泛应用于大数据计算框架的列存储格式,如Spark、Hive和Impala。列存储相比行存储,能减少IO量,通过压缩编码节省空间,并支持向量运算提升扫描性能。Parquet文件包含数据和schema,由行组、列块和页组成。性能调优关键在于合理设置dfs.blocksize和parquet.block.size,以平衡并行度和内存开销。推荐每个RowGroup和HDFS块大小均为1GB。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


介绍


Parquet是目前比较流行的大数据文件列存储格式,主流的大数据计算框架都对其有良好的支持,包括spark,hive,impala等。相对于传统的行存储模式,列存储主要有以下优点:

可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。
压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Encoding)进一步节约存储空间。
只读取需要的列,支持向量运算,能够获取更好的扫描性能。
相对于其它的列式存储格式,例如ORC,Parquet主要优势在于支持更为广泛,且对嵌套数据的支持更好。详细的比较可以参考

http://dongxicheng.org/mapreduce-nextgen/columnar-storage-parquet-and-orc/

主要概念

  • Parquet文件是以二进制方式存储的,不能直接读取和修改,文件中包括该文件的数据和schema(自解析,可以理解为类似JSON)
  • 行组(Row Group):按照行将数据物理上划分为多个单元,每一个行组包含一定的行数,Row group是数据读写时候的缓存单元,Parquet读写的时候会将整个行组缓存在内存中;
  • 列块(Column Chunk):列块负责存储一个行组中某一列的数据,行组中的所有列连续的存储在这个行组文件中。不同的列块可能使用不同的算法进行压缩。
  • 页(Page):每一个列块又划分为多个页,Page是压缩和编码的最小单元,对数据模型来说是透明的,在同一个列块的不同页可能使用不同的编码方式。

性能调优


如果采用HDFS文件系统,影响Parquet文件读写性能的参数主要有两个,dfs.blocksize和parquet.block.size

  • dfs.blocksize: 控制HDFS file中每个block的大小,该参数主要影响计算任务的并行度,例如在spark中,一个map操作的默认分区数=(输入文件的大小/dfs.block.size)*输入的文件数(分区数等于该操作产生的任务数),如果dfs.block.size设置过大或过小,都会导致生成的Task数量不合理,因此应根据实际计算所涉及的输入文件大小以及executor数量决定何时的值。
  • parquet.block.size 控制parquet的Row Group大小,一般情况下较大的值可以组织更大的连续存储的Column Chunk,有利于提升I/O性能,但上面也提到Row group是数据读写时候的缓存单元,每个需要读写的parquet文件都需要在内存中占据Row Group size设置的内存空间(读取的情况,由于可能跳过部分列,占据的内存会小于Row Group size),这样更大的Row Group size意味着更多的内存开销。同时设置该值时还需要考虑dfs.blocksize的值,尽量让Row Group size等同于HDFS一个block的大小,因为单个Row Group必须在一个计算任务中被处理,如果一个Row Group跨越了多个hdfs block可能会导致额外的远程数据读取。一般推荐的参数一个Row group大小1G,一个HDFS块大小1G,一个HDFS文件只含有一个块。

在Spark中可以使用如下方式修改默认配置参数:

val ONE_GB = 1024 * 1024 * 1024

sc.hadoopConfiguration.setInt("dfs.blocksize", ONE_GB)

sc.hadoopConfiguration.setInt("parquet.block.size", ONE_GB)


参考资料
http://ingest.tips/2015/01/31/parquet-row-group-size

http://www.infoq.com/cn/articles/in-depth-analysis-of-parquet-column-storage-format
 

### Parquet 文件格式介绍 Parquet文件格式是一种列式存储格式,专为高效查询而设计,在大数据生态系统中广泛应用于存储和处理大规模数据[^1]。作为一种开放的、跨平台的数据存储格式,Parquet不仅支持多种编程语言,还兼容多个主流的大数据分析框架,如Apache Hadoop, Apache Spark 和 Apache Hive等[^2]。 这种格式的主要优势在于其高效的压缩能力和优化过的读取性能,尤其适合于只读场景下的批量数据处理任务。通过将相同类型的字段连续存储在一起的方式,减少了I/O开销并提高了缓存命中率;同时利用先进的编码算法实现了更高的压缩比率,从而节省磁盘空间。 ### 使用方法概述 对于希望操作Parquet文件的应用开发者而言,可以借助Python中的`pandas`库以及专门针对该格式开发的API来进行创建、写入及读取工作: #### 安装依赖包 首先需安装必要的软件包来支持对Parquet文件的操作: ```bash pip install pandas pyarrow fastparquet ``` #### 创建与保存DataFrame至Parquet文件 下面展示如何使用Pandas DataFrame对象生成新的Parquet文件实例: ```python import pandas as pd data = {'column_1': ['a', 'b', 'c'], 'column_2': [1, 2, 3]} df = pd.DataFrame(data) # 将DataFrame保存成Parquet文件 df.to_parquet('example.parquet') ``` #### 加载现有Parquet文件到内存 当需要加载已有的Parquet文件时,则可以通过如下方式快速完成: ```python loaded_df = pd.read_parquet('example.parquet') print(loaded_df) ``` 上述代码片段展示了基本的Parquet文件读写的流程,实际应用过程中可能还需要考虑更多细节配置项以满足特定需求,比如调整行组大小设置等参数[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值