Parquet文件详解

article/2025/10/21 2:08:50

1、parquet文件简介

Apache Parquet是Apache Hadoop生态系统的一种免费的开源面向列的数据存储格式。 它类似于Hadoop中可用的其他列存储文件格式,如RCFile格式和ORC格式。
Apache Parquet 是由 Twitter 和 Cloudera 最先发起并合作开发的列存项目,也是 2010 年 Google 发表的 Dremel 论文中描述的内部列存格式的开源实现。和一些传统的列式存储(C-Store、MonetDB 等)系统相比,Dremel/Parquet 最大的贡献是支持嵌套格式数据(Nested Data)的列式存储。嵌套格式可以很自然的描述互联网和科学计算等领域的数据,Dremel/Parquet “原生”的支持嵌套格式数据减少了规则化、重新组合这些大规模数据的代价。
Parquet 的设计与计算框架、数据模型以及编程语言无关,可以与任意项目集成,因此应用广泛。目前已经是 Hadoop 大数据生态圈列式存储的事实标准。

行存和列存的区别

下图是拥有 A/B/C 3 个字段的简单示意表:
在这里插入图片描述
在面向行的存储中,例如csv文件,每列的数据依次排成一行,行的存储方式如下所示:
在这里插入图片描述
而在面向列的存储中,相同列的数据存储在一起,列的存储如下所示,
在这里插入图片描述
从上图,显而易见,行存适用于数据整行读取场景,而列存更适用于读取部分列数据(统计分析等)的场景。

parquet文件的优势

有这样一句话流传:如果说 HDFS 是大数据时代文件系统的事实标准,Parquet 就是大数据时代存储格式的事实标准。Parquet 这种列存的使用场景如下:

  1. Parquet 是一种支持嵌套结构的列式存储格式
  2. 非常适用于 OLAP 场景,按列存储和按列扫描

Parquet 这种列存的特点或优势主要体现在两方面

  1. 更高的压缩比
    列存使得更容易对每个列使用高效的压缩和编码,降低磁盘空间。(网上的case是不压缩、gzip、snappy分别能达到11/27/19的压缩比)
  2. 更小的IO操作
    使用映射下推和谓词下推,只读取需要的列,跳过不满足条件的列,能够减少不必要的数据扫描,带来性能的提升并在表字段比较多的时候更加明显。

关于映射下推与谓词下推: 映射下推,这是列式存储最突出的优势,是指在获取数据时只需要扫描需要的列,不用全部扫描。
谓词下推,是指通过将一些过滤条件尽可能的在最底层执行以减少结果集。谓词就是指这些过滤条件,即返回bool:true和false的表达式,比如SQL中的大于小于等于、Like、Is Null等。

2、parquet文件结构

从内容和元数据的角度来看,Parquet文件主要包含两部分内容:

  1. data
  2. metadata
    data是文件中的数据,metadata是文件的元数据信息。数据data首先写入文件,元数据metadata最后写入文件。
    在这图一里插入图片描述
    图一

    图二

从图一和图二所示,一个Parquet有可以分为以下的3个部分:

  1. Header文件头信息
  2. Data Block数据信息
  3. Footer尾部信息
    一个Parquet一般主要包含一个header,一个Data以及一个footer。其中一个Data包含多个Row Group。

Header
header中包含了一个4-byte的magic number(PAR1),这个magic number代表当前该文件是是Parquet格式。

Data Block
Data Block是文件存放具体内容的位置,其中就涉及了Parquet文件的结构,是非常重要的部分。针对文件的存储结构展开说明,
关于parquet文件结构的术语如下:

  1. Block (hdfs Block): 表示hdfs中的块,描述该文件格式的含义不变。该文件格式被设计成在hdfs上很好地工作。
  2. File: hdfs文件,必须包含文件的元数据。它不需要实际包含数据。
  3. 行组(Row Group): 数据的逻辑水平分区。行组没有保证的物理结构。行组由数据集中每一列的列块组成。一个行组中包含的具体行数是不确定的
  4. 列块(Colunm Chunk): 特定列的数据块。它们位于特定的行组中,并保证在文件中是连续的。
  5. 页(Pages): 列块被划分为页。从概念上讲,页面是一个不可分割的单元,压缩和编码都是针对Page进行的。列块中可以有多个分页类型。

官网文件结构图如下所示,其中一个File包含多个Row groups行组,一个行组中包含多个列块,一个列块对应一列数据,并且一个列块中有多个数据页Page,数据页Page才是文件存放的基本单位,数据页可以进行数据压缩和编码。下图的左边和右边合起来是一个完整的文件,左边在上面,右边在下面。
在这里插入图片描述
如上图所示,Parquet 的存储模型主要由 **行组(Row Group)、列块(Column Chuck)、页(Page)**组成。Block和File与Parquet文件结构关系不大。
1、行组,Row Group:一个完整的Parquet文件在水平方向上将被划分为一个或者多个行组,默认一个行组的大小与 HDFS Block 块大小对齐,主要是为了保证Parquet一个行组会被一个Mapper 处理。一个行组中有多少行,是不确定的,和行组以及列块的大小有关系。
2、列块,Column Chunk:行组中的每一列都是一个列块,行组中有n列,就会有n个列块,不过这个n个列块的名字可能一样的,一个列块具有相同的数据类型。
3、页,Page:Parquet 是页存储方式,每一个列块包含一个或者多个页,一个页是最小的编码单位,同一列块的不同页可以使用不同的编码方式。压缩和编码都是针对Page进行的。

也可以用以下的方式显示文件的机构:

4-byte magic number "PAR1"<RowGroup-1 Column 1 Chunk 1-1 + Column Metadata>
<RowGroup-1 Column 2 Chunk 1-2 + Column Metadata>
<RowGroup-1 Column N Chunk 1-3 + Column Metadata><RowGroup-2 Column 1 Chunk 2-1 + Column Metadata>
<RowGroup-2 Column 2 Chunk 2-2 + Column Metadata>
<RowGroup-2 Column N Chunk 2-3 + Column Metadata><RowGroup-M Column 1 Chunk M-1 + Column Metadata>
<RowGroup-M Column 2 Chunk M-2 + Column Metadata>
<RowGroup-M Column N Chunk M-3 + Column Metadata>File Metadata
4-byte length in bytes of file metadata
4-byte magic number "PAR1"

整个文件有 N 个列,整个文件被划分成M 个行组,每个行组都有N个列,行组中的每个列只有一个Chunk,一个行组就有N个Chunk。文件的元数据信息存储在数据之后,包含了所有列块元数据信息的起始位置。读取的时候首先从文件末尾读取文件元数据信息,再从元数据总其中找到某一个需要的 Column Chunk 信息,并依次读取。
Parquet文件中的数据被划分为多个Row Group。这些Row Group由一个或多个column chunks组成,column chunks对应于数据集中的一列。每个column chunks的数据以page的形式写入。每个pages只包含特定列的值,因此pages是非常好的压缩候选对象,因为它们包含类似的值。

FOOTER
文件的所有元数据信息保存在footer中。footer中的元数据包括version、schema、任何额外的键-值对,以及列元数据。列元数据包括类型、路径、编码、值的数量、压缩大小等。Footer中除了文件元数据之外,它还有一个4字节字段长度的footer length,以及一个4字节的魔术字(PAR1)。

3、parquet文件的元数据(metadata)内容

4、schema的讲解和使用


http://chatgpt.dhexx.cn/article/jX6tLmd0.shtml

相关文章

Gson解析json数据

gson是谷歌推出的&#xff0c;除此之外还有阿里的FastJson&#xff0c;官方json和jackjson。下面通过一个实例来讲解使用gson来解析json数据&#xff1a; 1.先做好准备工作&#xff0c;在网上下载Gson的jar包&#xff0c;放到工程的libs(没有此目录的话自己建一个)目录下: ht…

Android Gson解析json

前言&#xff1a; 解析json的库有很多&#xff0c;如&#xff1a;JSON-Java、Gson、Jackson、FastJson…而Gson是谷歌的&#xff0c;相信自有它的好处 简介 用于json与java对象之间的转换通过 序列化和反序列化 实现功能强大&#xff0c;稳定性也好 使用 Gson提供了两个方…

Android 使用 Gson 解析 json 数据及生成

1.导入 Gson 包 第一种导入Gson 包的方式 在 app 文件下的 build.gradle 文件 导入 gson:2.9.1 包 implementation com.google.code.gson:gson:2.9.1第二种导入Gson 包的方式 直接去下载最新的 Gson 包 下载链接&#xff1a;gson.jar 选择最新的包进行下载 将下载的 gson…

用Gson解析json

首先我们需要导入gson的jar包&#xff0c;因为gson解析方法不是java官方的而是谷歌提供的。 一.把json数据转成java对象 首先因为已经手动导入了jar包&#xff0c;现在只需创建解析器对象&#xff0c;当然首先得有一个json类型的文件地址&#xff0c;和文件输出流 第二步调用…

Android --Gson解析json数据

Android --Gson解析json数据 private void analyseJson() throws Exception {InputStream isgetAssets().open("dataTest.json");ByteArrayOutputStream baosnew ByteArrayOutputStream();byte[] bytesnew byte[1024];int len;while ((lenis.read(bytes))!-1){baos.…

Gson解析json字符串

Gson 怎样使用gson把一个json字符串解析成一个jsonObject对象 因此我要把上面的fastjson转换成是gson&#xff0c;如下图&#xff1a; JsonObject object new JsonParser().parse(result).getAsJsonObject();怎样从gson中取出键的值 使用gson把json字符串转换成一个list集合 …

使用Gson解析Json数据

目录 一、Gson介绍 二、使用方法 完整代码&#xff1a; MainActivity: 布局&#xff1a; 运行结果&#xff1a; 一、Gson介绍 Gson是Google提供的一个Java库&#xff0c;用于将Java对象转换为JSON格式数据或将JSON格式数据转换为Java对象。 常用方法&#xff1a; 方法名…

用GSON解析Json格式数据

GSON是谷歌提供的开源库&#xff0c;用来解析Json格式的数据&#xff0c;非常好用。如果要使用GSON的话&#xff0c;则要先下载gson-2.2.4.jar这个文件&#xff0c;如果是在Android项目中使用&#xff0c;则在Android项目的libs目录下添加这个文件即可&#xff1b;如果是在Java…

Gson解析JSON

1.介绍 Gson是Google提供的处理JSON数据的Java类库&#xff0c;主要用于转换Java对象和JSON对象。 2.依赖 <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency><groupId>com.google.code.gson</groupId><artifac…

python 学习笔记—— #(井号)的作用

在Python语言中&#xff0c;经常看到#后面跟着一些文字。#的作用就是注释&#xff0c;用于解释代码是怎样的逻辑或者作用&#xff0c;方便自己或者别的程序员阅读代码时能够理解代码的意义。 例如 &#xff1a; 我们可以看到# &#xff08;井号&#xff09;跟着的文字是不会被程…

vue 输入网址后,url中自动出现井号#,如何去除

问题描述&#xff1a; 解决方法&#xff1a; 1.打开 2.找到 3.删除Hash 4.成功

URL中#号(井号)的作用

今天又看到了一篇非常好的来自HTTPWatch的文章&#xff0c;不得不推荐给大家。 1. 井号在URL中指定的是页面中的一个位置 井号作为页面定位符出现在URL中&#xff0c;比如&#xff1a;http://www.httpwatch.com/features.htm#print &#xff0c;此URL表示在页面features.htm中p…

StartUML 画类图操作大全

文章目录 基本用法新建项目添加模型添加类图修改项目、模型、类属性配置项目Profile添加类图添加类属性其余Tool的用法 进阶用法枚举方法/属性的类型方法返回值方法/属性的属性方法/属性的静态属性 最后 基本用法 新建项目 打开StartUML&#xff0c;选择Empty Project&#xff…

StarUML使用教程【画类图】

1.打开StarUML 打开后&#xff0c;默认就是画类图的模式 默认创建了一个untitled项目 2.修改工程名字 ** 鼠标双击** 【Untitled】 在这里进行填写相关信息 修改后&#xff0c;就变成了你修改的那个名字 3.创建类图 右键 右侧的名字&#xff0c;选择Add Diagram—>Class…

Idea怎么实现画类图

1.【file】-【Settings】-【Tools】-【Diagrams】-勾选Java Class Diagram的选项 2.右击类&#xff0c;【Diagrams】-【Show Diagram】

使用mermaid画类图

使用mermaid画类图 文章目录 使用mermaid画类图1.类与类之间的关系2.各种关系的强弱顺序 1.类与类之间的关系 mermaid类图关系语法 泛化&#xff08;Inheritance&#xff09; 一种继承关系&#xff0c;表示一般与特殊的关系&#xff0c;它指定了子类如何特化父类的所有特征和…

UML类图

一、类的属性的表示方式 在UML类图中&#xff0c;类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示&#xff0c;比如下图表示一个Employee类&#xff0c;它包含name,age和email这3个属性&#xff0c;以及modifyInfo()方法。 那么属性/方法名称前加的加号…

EA enterprise architect 画类图

准备工作 新建文件&#xff0c;参考画用例图的新建文件 画类图 以此为例 画类 工具箱&#xff0c;选中calss->class拖拽到左侧&#xff0c;填写类名 右键点击创建的类&#xff0c;选择功能与属性。属性类似于变量&#xff0c;功能类似于函数。为类添加属性和功能。 …

使用PlantUml插件画类图

一、PlantUml简介二、类与类之间关系汇总整理三、PlantUml类图语法介绍四、类图五、类图 PlantUml 代码 本文介绍如何使用 PlantUml 插件来画 Uml 图 一、PlantUml简介 PlantUML 是一个可以快速编写各种图表的工具&#xff0c;可以通过安装 Intellij Idea 或者 Vs Code 插件来…

UML类图画法全程解析

本节向大家介绍一下UML类图画法&#xff0c;主要包括UML类图元素和关系画法&#xff0c;希望通过本文的介绍&#xff0c;你对UML类图画法有一定的认识。 软件设计起步&#xff1a;UML类图画法 学习设计模式&#xff0c;画UML类图是基础&#xff0c;通过UML类图&#xff0c;能…