前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Parquet 文件是如何编写的——行组、页面、所需内存和刷新操作

Parquet 文件是如何编写的——行组、页面、所需内存和刷新操作

作者头像
shengjk1
发布于 2025-05-16 03:08:59
发布于 2025-05-16 03:08:59
8600
代码可运行
举报
文章被收录于专栏:码字搬砖码字搬砖
运行总次数:0
代码可运行

在原文翻译的基础上补充了一些东西

Parquet文件格式结构

一个Parquet文件由一个或者多个Row Groups组成,一个Row Groups由包含每一列的数据块组成,每个数据块包含了一个或者多个page,该page中包含了列数据。

所以,一个Row Group包含了一些行的所有列(在一个文件中是可以变的,下面会提到),对于一个Row Group,首先你看到的是一个列的内容,再者是第二列的内容,以此类推。 如果以后你需要某个Parquet文件的某一列,你需要读取所有Row Group的对应的列快,而不是所有Row Group所有内容。

写一行数据

虽然Parquet文件是列式存储,但是这个只是部内表示,你仍需要需要一行一行的写: InternalParquetRecordWriter.write(row)

每一行会被立即切成不同的列,并分别存储到不同的内存Column存储中。最大值/最小值以及null值会被更新到对应的列中。 现在一切的存储还在内存中。

Page

在写了100个数据的时候(对应100行),Parquet writer会检查这100个列值是否超过了指定的Page大小(默认是1MB)。 假如一个列的的原始数据没超过page的大小阈值,然后下一个page的大小会基于当前的实际列的大小进行调整,所以它既不是每一个列数据都检查一下,也不是每100列数据检查一下。因此Page大小不是固定的。 假如原始数据没有超过了Page大小,那么列内容就会被压缩(如果制定了压缩格式的话),并且被flush到列的Page存储中。 每一Page包含了元数据(Page header),元数据中包含了未压缩的数据大小,值的数量,以及统计信息:在这个page中这个列的最大最小值和null值的数量。 这个时候一切也还是在内存中,但是数据现在是压缩的了。

Row Group(block size)

在写了第一个100行数据到内存中以后,这个Parquet writer会检查数据的大小是否超过了pqrquet指定的Row Group大小(block size)(默认是128MB)。 这个大小包括了每一列在column存储中未压缩的数据大小(还没有被flushed到Page存储中)和每一列已经写入到Page存储中的压缩的数据大小。 假如数据大小没有超过指定的row group大小,Parquet writer将会根据平均的行大小来估算下一个row group大小,有可能是100甚至10000行,所哟row group大小限制也不是很严格。 假如数据大小超过了指定的row group大小,Parquet writer将会flush每一列column存储的数据到Page存储中,然后一列一列的将所有Page存储中数据的写到输出流中。 这是第一次数据被写到外部的流中(HadoopPositionOutputStream),这对外部组件可见,但是对终端用户不可见,例如 S3 Multipart Upload传输线程能够在后台上传数据到S3中。 注意:Row Group内容并不包含任何元数据(如统计信息,offset等),这些元数据信息会被写到footer中。

File Footer

当所有的row groups写到外部流中,并在关闭文件之前,Parquet writer将会在文件的末尾加上footer。 Footer包含了文件的schema(列名字和对应的类型)和关于每一个row group的细节(总的大小,行数,最大最小值,每一列的null值数量)。注意这些列的统计信息是row group级别的,而不是文件级别的。 把所有的元数据写到footer中,可以让Parquet writer不需要保c存整个文件在内存中或者磁盘里,这就是为什么row group能够安全的被flushed。 Logging 你可以通过查看应用日志来看Parquet writer是怎么工作的。这里有好几个重要的info信息。 假如当前的row group大小超过了row group的阈值-–checkBlockSizeReached():

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOG.info("mem size {} > {}: flushing {} records to disk.", memSize, nextRowGroupSize, recordCount); 1

真实的应用例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
May 29, 2020 1:58:35 PM org.apache.parquet.hadoop.InternalParquetRecordWriter checkBlockSizeReached
INFO: mem size 268641769 > 268435456: flushing 324554 records to disk.
12

以上日志说明,当前的数据大小是 268,641,769 bytes,然而row group大小是268,435,456 (256 MB),所以324,554行数据被flushed到外部流中。 当一个row group 被flushed之后,你会看到如下日志信息-flushRowGroupToStore():

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOG.info("Flushing mem columnStore to file. allocated memory: {}", columnStore.getAllocatedSize());
1

注意columnStore大小包括了Page存储的大小。 真实的应用例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
May 29, 2020 1:58:35 PM org.apache.parquet.hadoop.InternalParquetRecordWriter flushRowGroupToStore
INFO: Flushing mem columnStore to file. allocated memory: 199496450
12

向量化读取是指在读取 Parquet 格式的数据时,可以一次性读取多个列的数据,而不是逐行读取。这种方式可以提高读取数据的效率,因为它可以减少磁盘 I/O 操作的次数,从而减少了读取数据的时间。此外,向量化读取还可以利用现代 CPU 的 SIMD 指令集,进一步提高读取数据的速度。

原文地址: http://cloudsqale.com/2020/05/29/how-parquet-files-are-written-row-groups-pages-required-memory-and-flush-operations/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
两种列式存储格式:Parquet和ORC
随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌现了一批开源的数据分析引擎,例如Hive、Spark SQL、Impala、Presto等,同时也产生了多个高性能的列式存储格式,例如RCFile、ORC、Parquet等,本文主要从实现的角度上对比分析ORC和Parquet两种典型的列存格式,并对它们做了相应的对比测试。
不吃西红柿
2022/07/29
7.3K0
两种列式存储格式:Parquet和ORC
Parquet文件结构笔记
  Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,那么这里就总结下Parquet数据结构到底是什么样的呢?
用户3003813
2018/09/06
9310
Parquet文件结构笔记
【Parquet】Spark读取Parquet问题详解……
一个 Parquet 文件是由一个 header 以及一个或多个 block 块组成,以一个 footer 结尾。
857技术社区
2022/05/17
2.6K0
【Parquet】Spark读取Parquet问题详解……
深入分析 Parquet 列式存储格式
Parquet 是面向分析型业务的列式存储格式,由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 的孵化器里毕业成为 Apache 顶级项目,最新的版本是 1.8.0。
ApacheHudi
2021/04/13
1.7K0
Spark Parquet详解
Apache Parquet属于Hadoop生态圈的一种新型列式存储格式,既然属于Hadoop生态圈,因此也兼容大多圈内计算框架(Hadoop、Spark),另外Parquet是平台、语言无关的,这使得它的适用性很广,只要相关语言有对应支持的类库就可以用;
HoLoong
2020/10/10
1.8K0
Spark Parquet详解
干货 | 再来聊一聊 Parquet 列式存储格式
Parquet 是 Hadoop 生态圈中主流的列式存储格式,最早是由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 孵化器里毕业成为 Apache 顶级项目。
大数据技术架构
2021/08/25
4.2K0
干货 | 再来聊一聊 Parquet 列式存储格式
基于Apache Parquet™的更细粒度的加密方法
数据访问限制、保留和静态加密是基本的安全控制。 本博客介绍了uber如何构建和利用开源 Apache Parquet™ 的细粒度加密功能以统一的方式支持所有 3 个控件。 特别是,我们将重点关注以安全、可靠和高效的方式设计和应用加密的技术挑战。 本文还将分享uber在生产和大规模管理系统的推荐实践方面的经验。
从大数据到人工智能
2022/03/22
2.2K0
基于Apache Parquet™的更细粒度的加密方法
Hive重点难点:Hive原理&优化&面试(下)
Map在读取数据时,先将数据拆分成若干数据,并读取到Map方法中被处理。数据在输出的时候,被分成若干分区并写入内存缓存(buffer)中,内存缓存被数据填充到一定程度会溢出到磁盘并排序,当Map执行完后会将一个机器上输出的临时文件进行归并存入到HDFS中。
大数据真好玩
2021/10/25
1.7K0
Hive重点难点:Hive原理&优化&面试(下)
Apache Parquet 干货分享
Parquet 是一种面向分析的、通用的列式存储格式,兼容各种数据处理框架比如 Spark、Hive、Impala 等,同时支持 Avro、Thrift、Protocol Buffers 等数据模型。
大数据技术架构
2019/08/16
2.1K0
Apache Parquet 干货分享
Hive - ORC 文件存储格式详细解析
ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet类似,它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储。ORC文件是自描述的,它的元数据使用Protocol Buffers序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗,目前也被Spark SQL、Presto等查询引擎支持,但是Impala对于ORC目前没有支持,仍然使用Parquet作为主要的列式存储格式。2015年ORC项目被Apache项目基金会提升为Apache顶级项目。ORC具有以下一些优势:
王知无-import_bigdata
2020/12/08
13.8K0
Hive - ORC 文件存储格式详细解析
Parquet文件存储格式详细解析
Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎和计算框架都已适配,并且可以很方便的将其它序列化工具生成的数据转换成Parquet格式。
王知无-import_bigdata
2020/12/08
6.4K0
Parquet文件存储格式详细解析
列式存储引擎-内核机制-Parquet格式
Parquet继承了Protocol Buffer的数据模型。每个记录由一个或多个字段组成。每个字段可以是atomic字段或者group字段。Group字段包含嵌套的字段,每层可以要么是atomic要么是group字段。每个字段定义由两部分组成:数据类型(基本的数据类型,比如int32或者byte array)、repetition类型(定义字段值出现的次数):required(1次)、optional(0或者1次)、repeated(0次或大于1次)。
yzsDBA
2023/09/07
8010
列式存储引擎-内核机制-Parquet格式
Apache Doris 入门 10 问
基于 Apache Doris 在读写流程、副本一致性机制、 存储机制、高可用机制等方面的常见疑问点进行梳理,并以问答形式进行解答。在开始之前,我们先对本文相关的名词进行解释:
SelectDB技术团队
2024/01/10
1.5K0
再来聊一聊 Parquet 列式存储格式
Parquet 是 Hadoop 生态圈中主流的列式存储格式,最早是由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 孵化器里毕业成为 Apache 顶级项目。
大数据技术架构
2020/05/21
11.8K0
Parquet存储的数据模型以及文件格式
Aapche Parquet是一种能有效存储嵌套数据的列式存储格式,在Spark中应用较多。
火之高兴
2024/07/25
4700
Parquet存储的数据模型以及文件格式
大数据的列式存储格式:Parquet
之前简单介绍了一下列式存储: 和谐号为啥快?因为铁轨是列式存储! 今天介绍一种大数据时代有名的列式存储文件格式:Parquet,被广泛用于 Spark、Hadoop 数据存储。Parquet 的中文是镶木地板,意思是结构紧凑,空间占用率高。注意,Parquet 是一种文件格式!
Apache IoTDB
2020/09/27
2.1K0
大数据的列式存储格式:Parquet
Hive函数
**CONCAT_WS(separator, str1, str2,...):**多字符串拼接
ha_lydms
2023/11/19
5541
Hive函数
「Apache Hudi系列」核心概念与架构设计总结
Apache Hudi依赖 HDFS 做底层的存储,所以可以支撑非常大规模的数据存储。同时基于下面两个原语,Hudi可以解决流批一体的存储问题。
王知无-import_bigdata
2022/03/11
1.4K0
「Apache Hudi系列」核心概念与架构设计总结
Hive快速入门系列(13) | Hive的数据存储格式
  查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。
不温卜火
2020/10/28
2.3K0
Hive快速入门系列(13) | Hive的数据存储格式
大数据小视角2:ORCFile与Parquet,开源圈背后的生意
Facebook在 2011年的 ICDE 会议之上发布了RCFile。之后RCFile在Hive之中作为很好的列存储模型被广泛使用,虽然RCFile能够很好的提升Hive的工作性能,但是在Facebook论文之中也提出了一些RCFile值得改进的地方。所以在2013年,HortonWorks就在RCFile的基础之上开发出了ORCFile,并且ORCFlie很顺利地在2015年成为Apache的顶级项目。接下来我们来看一看ORCFile相对于原本的RCFile解决了什么样的问题:
HappenLee
2018/09/05
9200
大数据小视角2:ORCFile与Parquet,开源圈背后的生意
相关推荐
两种列式存储格式:Parquet和ORC
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验