Parquet原理剖析

article/2025/10/20 22:22:27

行存VS列存

广义的数据分析系统大致分为可以分为计算层、数据格式层和存储层。
计算层主要负责数据查询的介入和各种逻辑计算,如:MR、Spark、Flink。
存储层承载数据持久化存储,以文件语义或类似文件语义(对象存储)对接计算层。
数据格式层:定义了存储层文件的组织格式,计算层通过格式层来读写文件。严格来说并不算一个独立的层级,而是计算层上的一个Lib
在这里插入图片描述
行存将相同行数据连续存储,因此具有更高的整行数据读取效率,增删某行数据只需顺序IO读写即可,对于频繁的数据行增删操作更加友好。因此被广泛用在Mysql,Oracle等OLTP数据库中。
列存相较于行存的优势在与更好的压缩编码效率,以及读取整列更高效率,因此被广泛应用于数据湖、Clickhouse等OLAP数据库中。

Parquet原理解析

Parquet文件组织形式

Parquet是列存储格式,Parquet文件内部按照行列划分后,将相同列的数据存储在一起。parquet文件内部划分为一下几个单元:
RowGroup:首先将数据按一定数量或固定行数划分为多个RowGroup
ColumnChunk:在同一个RowGroup中按照不同的列划分为不同的ColumnChunk
Page:一个ColumnChunk中按照一定大小,一般建议8kb,划分为多个page,每个page作为数据压缩和编码基本单位。page内部根据存储内容分为:DataPage(存储编码后的数据)、DictionaryPage(对于字典编码,DictionaryPage存储index和数据的映射关系)、IndexPage(MinMaxIndex、BloomFilter)
Footer保存文件元数据:保存了文件的Schema、Config和Metadatea(RowGroup Meta和Column Meta)。可以根据文件Footer中记录的不同RowGroup中不同ColumnChunk的date page和index page的offset快速定位到数据文件。
在这里插入图片描述

Parquet编码格式

  • Plain 直接存储原始数据,将数据序列化后直接存储,不进行特殊处理。
  • Run Length Encoding(RLE):适用于基数不大,重复值较多的场景。如Boolean、枚举等,相较于Plain节省更多存储空间。
    在这里插入图片描述
  • 字典编码 Dictionary Encoding:基于基数不大的场景构建字典表,写入Dictionary Page,把数据用Index代替,然后用RLE编码。在这里插入图片描述

Parquet索引

相较于OLTP数据库的索引,parquet的索引机制相对简陋。

  • Min-Max Index:记录Page内部Column的Min_Value和Max_Value
  • Column Index:在Footer的Column Metadata中记录了每个ColumnChunk的全部Page的Min-Max Value
  • Offset Index:在Footer中记录Page在文件中的offset和Row Range
  • Bloom Index:对于基数较大,或者非排序的过滤场景,Min_Max很难发挥作用,BloomFilter可以加速过滤匹配。开启Parquet文件会在每个ColumnChunk的头部保存Bloom Filter数据,并在Footer的ColumnMetaData记录BloomFilter的page offset。

过滤下推

parquet-mr实现的高效过滤机制,引擎侧传入Filter Expression,parquet-mr转换成具体的Column匹配条件,然后查询Footer的ColumnIndex定位到具体的行号,并利用Index过滤一些不匹配的ColumnChunk,将有效数据返回给引擎侧,减少IO量。在这里插入图片描述


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

相关文章

Spark 实战 - 3.一文搞懂 parquet

一.引用 parquet 文件常见于 Spark、Hive、Streamin、MapReduce 等大数据场景,通过列式存储和元数据存储的方式实现了高效的数据存储与检索,下面主要讲 parquet 文件在 spark 场景下的存储,读取与使用中可能遇到的坑。 二.Parquet 加载方式 …

Spark Parquet使用

Spark SQL下的Parquet使用最佳实践和代码实战 分类: spark-sql(1) 一、Spark SQL下的Parquet使用最佳实践 1)过去整个业界对大数据的分析的技术栈的Pipeline一般分为以下两种方式: a)Data Source -> HD…

Arrow 之 Parquet

Parquet-format 左边是文件开头及具体的数据, 右边是文件结尾的 Footer Metadata There are three types of metadata: file metadata, column (chunk) metadata and page header metadata. All thrift structures are serialized using the TCompactProtocol. Co…

parquet存入mysql_解密列存 parquet

在做数据分析的时候,相对于传统关系型数据库,我们更倾向于计算列之间的关系。在使用传统关系型数据库时,基于此的设计,我们会扫描很多我们并不关心的列,这导致了查询效率的低下,大部分数据库 io 比较低效。因此目前出现了列式存储。Apache Parquet 是一个列式存储的文件格…

Parquet原理

在互联网大数据应用场景下,通常数据量很大且字段很多, 但每次查询数据只针对其中的少数几个字段,这时候列式存储是极佳的选择。 列式存储要解决的问题: 把IO只给查询需要用到的数据 只加载需要被计算的列空间节省 列式的压缩效…

parquet--golang使用

github 其实如果不适用一些可视化工具解析parquet文件,不太好看parquet文件内部正常应该是什么样的。但是使用一些可视化工具的话,可以发现,parquet文件会像表格,如excel文件,csv文件那样,排列数据。通过结…

Parquet

动机 创建Parquet是利用压缩性,高效的列式存储来在Haddop生态圈任何项目中应用. 记住Parquet是构建在复杂嵌套的数据结构, 并且使用记录分解和集成的算法在Dremely论文中描述.我们相信这种方法是更强大的的可以非常简单的使嵌套命令空间的扁平化. Parquet构建可以非常高效的…

Parquet 存储格式

1.介绍 Apache Parquet 是 Hadoop 生态圈中一种新型列式存储格式,它可以兼容 Hadoop 生态圈中大多数计算框架(Mapreduce、Spark 等),被多种查询引擎支持(Hive、Impala、Drill 等),并且它是语言和平台无关的。 2.特点…

parquet 简介

参考文章:parquet 简介 Parquet原理 【2019-05-29】Parquet 简介 Apache Parquet是一种能够有效存储嵌套数据的列式存储格式。 面向分析型业务的列式存储格式 由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 的孵化器里毕业成为 Apache 顶…

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;跟着的文字是不会被程…