列式存储引擎-内核机制-Parquet格式

列式存储引擎-内核机制-Parquet格式

Parquet是一种开源的列式存储结构,广泛应用于大数据领域。

1、数据模型和schema

Parquet继承了Protocol Buffer的数据模型。每个记录由一个或多个字段组成。每个字段可以是atomic字段或者group字段。Group字段包含嵌套的字段,每层可以要么是atomic要么是group字段。每个字段定义由两部分组成:数据类型(基本的数据类型,比如int32或者byte array)、repetition类型(定义字段值出现的次数):required(1次)、optional(0或者1次)、repeated(0次或大于1次)。

看一个简单的示例:

2e3e94109036b213865231625137f58c.png

Schema的最上层是message,里面包含3个字段。每个字段有3个属性:重复性(repetition)、类型(type)和名称(name)。其中contacts是一个group类型,即嵌套结构。

数据示例:

f273f2f984194729ded3011e00dbb178.png

2、repetition和definition 级别

为了编码嵌套列,parquet 使用 dremel 通过 definition levels 和 repetition levels 来实现。

Repetition levels:用以表示在该字段路径上哪个节点进行了重复(at what repeated field in the field’s path the value has repeated)

Definition Levels:用以表示该字段路径上有多少可选的字段实际进行了定义(how many fields in p that could be undefined (because they are optional or repeated) are actually present)

1)比如:嵌套a.b.c三个3字段。字段path就是a.b.c

2)Repetition levels用来表示path中哪个部分是重复的。如果在a上重复了,那么level是1,b上重复level是2,c上重复level是3.

3)definition levels用来看下字段path中多少可选字段部分(optional和repeated)是定义的(即有值),求个和

为什么需要definition levels呢?

由于optional和repeated类型的存在,可能一条记录中某一列没有值,假设不记录这样的值,就会导致本该属于下一条记录的值被当作当前记录的一部分了,从而导致数据错误。下面的例子说明这点。

Dremel: Interactive Analysis of Web-Scale Datasets论文中的例子

1)Schema定义:

738988487137f354a2a73e6e4f06c61e.png

2)两条记录

9619a572881295147fa9d44140897188.pngdc77f075c80e0e8dcf765eac78b91cc8.png

3)上述记录的RD表示

8222bf4fd320b65bae57c5163ae6dce6.png

4)先以Links.Backward来说明为什么需要D

第1条记录中Links.Backward没有值,对该字段补NULL。此时Links.Backward的NULL没有一部分是重复的,所以R值为0。

第2条记录中Links.Backward有10和30两个值,10这个没有一部分是重复的,所以R值为0,30这个在Backward上重复,R值是1。

那么,不使用D的话,就将NULL,10,30都归到第1条记录了。

5)来看Name.Language.Code的D。Name和Language都是可选字段。

en-us的这个值出现了,即Code出现了,表示前两个也出现,所以它的值是2

NULL的这个,即表示url:http://B 这个的,仅name出现,所以该路径上可选项为1个。

注意

1)required和optional字段不需要repetition level,只有repeated可重复的字段需要,所以这个路径的level仅算repeated的。比如Links.Backward这个路径Links是optional,仅Backward是repeated,所以Backward的repetition level是1。

2)Name.Language.Code的第一个NULL,表示url:http://B 这个的,它的R是在Name上重复,所以是1

3、编码

将给定数据转换成编码形式。根据使用的方法,编码有不同目的:确保数据正确性、缩短数据或者正确书写字符。Parquet中有:Plain、RLE/bit-packing、Delta编码。

3.1 Plain编码

对数据没有压缩和其他处理。所有类型均可使用。比如int32以4个字节存储,下图显示了0到3数字如何以plain编码方式进行存储:

c6beebb10c7b7853df387c2d919700f5.png

3.2 RLE编码

Run-Length encoding算法,针对连续重复的数据,记录重复次数及对应值:

9301be48de527340bb1562873e4b9650.png

3.3 Bit-packing

基于这么个假设:每个int32或int64的值并不总是需要全部的32位或者64位。因此,不将这些值存储在他们的全部范围中,bit-packing将多个值打包到一个空间中。从数值的最低有效位开始压缩。最低有效位的意思,就是数值从二进制表示的值是 1 的最低的位置。从右边开始。例如针对数值是从 0 到 7,7占有的位长是 3, 按照 3 的位长来进行按位操作。如下:

# bitwidth of 3
output[0] = ((input[0] & 7) | ((input[1] & 7) <<  3) | ((input[2] & 7) <<  6)) & 255
output[1] = (((input[2] & 7) >>> 2) | ((input[3] & 7) <<  1) | ((input[4] & 7) <<  4)) | ((input[5] & 7) <<  7)) & 255
output[2] = (((input[5] & 7) >>> 1) | ((input[6] & 7) <<  2) | ((input[7] & 7) <<  5)) & 255

10c8fd3c1afe7c90d82d502d2df149d3.png

上图是0,1,2三个值打包的示例。使用三位来表示一个值。input[0]使用最低3位,input[1]使用中间三位,input[3]使用最高的2位。

3.4 Dictionary Encoding 编码

45836b5c89070e572f6735e8e0507202.png

对每个未压缩的数据使用数字进行编码。当然可以和上述的RLE/bit-packing结合。

3.5 Delta

可以用在整数和字节数组。delta 编码记录一个值和它之后一个值的差异,比如:

to_encode = [1, 2, 5, 7, 9]encoded = [1, 1, 3, 2, 2]

2比前一个值大1,5比前一个值大3,依次类推。

to_encode = [abc, abcd, abcde, abcdef]encoded = [abc, 3d, 4e, 5e, 6f]

字节的话,abcd与前一个不同在于第3个值是d,依次类推。

Delta 编码又被称为 incremental 变化,增量编码。非常适合有同样前缀的有序的字符串。

4、存储格式

ff447f8d4174a983c7774dae33e84e18.png

这里存储模型又可以理解为存储格式或文件格式,Parquet 的存储模型主要由行组(Row Group)、列块(Column Chuck)、页(Page)组成。

1、行组,Row Group:Parquet 在水平方向上将数据划分为行组,默认行组大小与 HDFS Block 块大小对齐,Parquet 保证一个行组会被一个 Mapper 处理。

2、列块,Column Chunk:行组中每一列保存在一个列块中,一个列块具有相同的数据类型,不同的列块可以使用不同的压缩。

3、页,Page:Parquet 是页存储方式,每一个列块包含多个页,一个页是最小的编码的单位,同一列块的不同页可以使用不同的编码方式。

5、参考

https://www.waitingforcode.com/apache-parquet/encodings-apache-parquet/read

https://github.com/apache/parquet-format

https://github.com/apache/parquet-format/blob/master/Encodings.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/86159.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源与专有软件:比较与对比

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

2023年高教社杯 国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

C语言——指针进阶(一)

目录 ​编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 ​编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 ​编辑 五.…

C语言链表梳理-2

链表头使用结构体&#xff1a;struct Class 链表中的每一项使用结构体&#xff1a;struct Student#include <stdio.h>struct Student {char * StudentName;int StudentAge;int StudentSex;struct Student * NextStudent; };struct Class {char *ClassName;struct Stude…

FxFactory 8 Pro Mac 苹果电脑版 fcpx/ae/motion视觉特效软件包

FxFactory pro for mac是应用在Mac上的fcpx/ae/pr视觉特效插件包&#xff0c;包含了成百上千的视觉效果&#xff0c;打包了很多插件&#xff0c;如调色插件&#xff0c;转场插件&#xff0c;视觉插件&#xff0c;特效插件&#xff0c;文字插件&#xff0c;音频插件&#xff0c;…

【内网穿透】搭建我的世界Java版服务器,公网远程联机

目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统&#xff08;支持一键自动安装脚本&#xff09; 3.2 创建隧道映射内网端口 3.3 测试公网远程…

PHP聚合支付网站源码/对接十多个支付接口 第三方/第四方支付/系统源码

PHP聚合支付网站源码/对接十多个支付接口 第三方/第四方支付/系统源码 内附数十个支付接口代码文件。 下载地址&#xff1a;https://bbs.csdn.net/topics/616764485

Apache StreamPark系列教程第一篇——安装和体验

一、StreamPark介绍 实时即未来,在实时处理流域 Apache Spark 和 Apache Flink 是一个伟大的进步,尤其是Apache Flink被普遍认为是下一代大数据流计算引擎, 我们在使用 Flink & Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验…

【Day-21慢就是快】代码随想录-栈与队列-逆波兰表达式求值

逆波兰表达式&#xff1a;是一种后缀表达式&#xff0c;所谓后缀就是指运算符写在后面。 平常使用的算式则是一种中缀表达式&#xff0c;如 ( 1 2 ) * ( 3 4 ) 。 该算式的逆波兰表达式写法为 ( ( 1 2 ) ( 3 4 ) * ) 。 逆波兰表达式主要有以下两个优点&#xff1a; 去掉…

【前端】CSS技巧与样式优化

目录 一、前言二、精灵图1、什么是精灵图2、为什么需要精灵图3、精灵图的使用①、创建CSS精灵图的步骤1&#xff09;、选择合适的图标2&#xff09;、合并图片3&#xff09;、设置背景定位 ②、优化CSS精灵图的技巧1&#xff09;、维护方便2&#xff09;、考虑Retina屏幕3&…

远程调试环境

一、远程调试 1.安装vscode 2.打开vscode&#xff0c;下载插件Remote-SSH,用于远程连接 3.安装php debug 4.远程连接&#xff0c;连接到远端服务器 注&#xff1a;连接远程成功后&#xff0c;在远程依然要进行安装xdebug&#xff0c;刚才只是在vscode中进行的安装。 5.配置la…

【Redis从头学-13】Redis哨兵模式解析以及搭建指南

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…