parquet 简介

article/2025/10/21 2:05:41

参考文章:parquet 简介

Parquet原理

【2019-05-29】Parquet

简介

Apache Parquet是一种能够有效存储嵌套数据的列式存储格式。

面向分析型业务的列式存储格式

由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 的孵化器里毕业成为 Apache 顶级项目。

Parquet源码 : https://github.com/apache/parquet-mr

Parquet的设计目标:

  • 适配通用性
  • 存储空间优化
  • 计算时间优化

Parquet的原子类型:

Parquet的逻辑类型:

 Parquet文件的内部结构:

Parquet文件由一个文件头(header),一个或多个紧随其后的文件块(block),以及一个用于结尾的文件尾(footer)构成。文件头仅包含
Parquet文件的每个文件块负责存储一个行组,行组由列块组成,且一个列块负责存储一列数据。每个列块中的的数据以页为单位。

列式存储

概念:传统的思维中是按照一条记录一条记录的组织存储,列式存储是竖过来,按照一列一列的方式组织存储。

每次查询数据只针对其中的少数几个字段,这时候列式存储是极佳的选择。

列式存储要解决的问题:

  • 把IO只给查询需要用到的数据
    • 只加载需要被计算的列
  • 空间节省
    • 列式的压缩效果更好
    • 可以针对数据类型进行编码
  • 开启矢量化的执行引擎(不再1条1条的处理数据,而是一次处理1024条数据)

列式存储和行式存储相比的优势:

  1. 可以跳过不符合条件的数据,只读取需要的数据,降低 IO 数据量。
  2. 压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如 Run Length Encoding 和 Delta Encoding)进一步节约存储空间。
  3. 只读取需要的列,支持向量运算,能够获取更好的扫描性能。

 当时 Twitter 的日增数据量达到压缩之后的 100TB+,存储在 HDFS 上,工程师会使用多种计算框架(例如 MapReduce, Hive, Pig 等)对这些数据做分析和挖掘;

日志结构是复杂的嵌套数据类型,例如一个典型的日志的 schema 有 87 列,嵌套了 7 层。所以需要设计一种列式存储格式,既能支持关系型数据(简单数据类型),又能支持复杂的嵌套类型的数据,同时能够适配多种数据处理框架。

关系型数据的列式存储,可以将每一列的值直接排列下来,不用引入其他的概念,也不会丢失数据。

适配通用性

Parquet只是一种存储格式,它与上层平台、语言无关,不需要与任何一种数据处理框架绑定,目前已经适配的组件包括:

  • 查询引擎:Hive\Impala\Pig\Presto\Drill\Tajo\HAWQ\IBM Big SQL
  • 计算引擎:MapReduce\Spark\Cascading\Crunch\Scalding\Kite
  • 数据模型:Avro\Thrift\Protocol Buffers

Parquet的数据模型

每条记录中的字段可以包含三种类型:required, repeated, optional。最终由所有叶子节点来代表整个schema。

  • 元组的Schema可以转换成树状结构,根节点可以理解为repeated类型
  • 所有叶子结点都是基本类型
  • 没有Map、Array这样的复杂数据结构,但是可以通过repeated和group组合来实现这样的需求

Parquet文件格式

Parquet文件是二进制方式存储的,文件中包含数据和元数据,可以直接进行解析

先了解一下关于Parquet文件的几个基本概念:

  • 行组(Row Group):每一个行组包含一定的行数,一般对应一个HDFS文件块,Parquet读写的时候会将整个行组缓存在内存中。
  • 列块(Column Chunk):在一个行组中每一列保存在一个列块中,一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。
  • 页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

 

Parquet文件组成:

  • 文件开始和结束的4个字节都是Magic Code,用于校验它是否是一个Parquet文件
  • 结束MagicCode前的Footer length是文件元数据的大小,通过该值和文件长度可以计算出元数据Footer的偏移量
  • 再往前推是Footer文件的元数据,里面包含:

    • 文件级别的信息:版本,Schema,Extra key/value对等
    • 每个行组的元信息,每个行组是由多个列块组成的:
      • 每个列块的元信息:类型,路径,编码方式,第1个数据页的位置,第1个索引页的位置,压缩的、未压缩的尺寸,额外的KV
  • 文件中大部分内容是各个行组信息:

    • 一个行组由多个列块组成
      • 一个列块由多个页组成,在Parquet中有三种页:
        • 数据页
          • 一个页由页头、repetition levels\definition levles\valus组成
        • 字典页
          • 存储该列值的编码字典,每一个列块中最多包含一个字典页
        • 索引页
          • 用来存储当前行组下该列的索引,目前Parquet中还不支持索引页,但是在后面的版本中增加

Parquet 适配多种计算框架

Parquet 是语言无关的,

而且不与任何一种数据处理框架绑定在一起,

适配多种语言和组件,能够与 Parquet 配合的组件有:

  • 查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
  • 计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
  • 数据模型: Avro, Thrift, Protocol Buffers, POJOs

 


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

相关文章

Parquet文件详解

1、parquet文件简介 Apache Parquet是Apache Hadoop生态系统的一种免费的开源面向列的数据存储格式。 它类似于Hadoop中可用的其他列存储文件格式,如RCFile格式和ORC格式。 Apache Parquet 是由 Twitter 和 Cloudera 最先发起并合作开发的列存项目,也是…

Gson解析json数据

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

Android Gson解析json

前言: 解析json的库有很多,如:JSON-Java、Gson、Jackson、FastJson…而Gson是谷歌的,相信自有它的好处 简介 用于json与java对象之间的转换通过 序列化和反序列化 实现功能强大,稳定性也好 使用 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 包 下载链接:gson.jar 选择最新的包进行下载 将下载的 gson…

用Gson解析json

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

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,如下图: JsonObject object new JsonParser().parse(result).getAsJsonObject();怎样从gson中取出键的值 使用gson把json字符串转换成一个list集合 …

使用Gson解析Json数据

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

用GSON解析Json格式数据

GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用。如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的libs目录下添加这个文件即可;如果是在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 插件来…