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

news2024/11/24 15:53:04

列式存储引擎-内核机制-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.coloradmin.cn/o/937672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件工程(九) UML顺序-活动-状态-通信图

顺序图和后面的一些图,要求没有用例图和类图那么高,但仍然是比较重要的,我们也需要按程度去了解。 1、顺序图 顺序图(sequence diagram, 顺序图),顺序图是一种交互图(interaction diagram),它强调的是对象之间消息发送的顺序,同时显示对象之间的交互。 下面以一个简…

Python WEB框架之FastAPI

Python WEB框架之FastAPI 今天想记录一下最近项目上一直在用的Python框架——FastAPI。 个人认为&#xff0c;FastAPI是我目前接触到的Python最好用的WEB框架&#xff0c;没有之一。 之前也使用过像Django、Flask等框架&#xff0c;但是Django就用起来太重了&#xff0c;各种…

remove elements in c++

https://www.youtube.com/watch?vq5OfB6ZXT6E&listPL5jc9xFGsL8E_BJAbOw_DH6nWDxKtzBPA&index4

AUTOSAR规范与ECU软件开发(实践篇)6.7 服务软件组件与应用层软件组件端口连接

在生成了BSW模块的代码后, 切换到ISOLAR-A系统级设计界面,会发现产生一些基础软件模块的服务软件组件: BswM、 ComM、 Det和EcuM等, 如图6.60所示。 图6.60 生成了BSW后的服务软件组件 此时, 如果涉及服务软件组件与应用层软件组件的交互, 就需要为应用层软件组…

PowerDesigner学习笔记

备注&#xff1a;文章主要对概念数据模型进行深入分析 1.对各种模型图初步认识 1.1.概念数据模型 (CDM) (Conceptual Data Model) 对数据和信息进行建模&#xff0c;利用实体-关系图&#xff08;E-R图&#xff09;的形式组织数据&#xff0c;检验数据设计的有效性和合理性。 …

【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

字符串翻转合集 344. 反转字符串541. 反转字符串Ⅱ151. 反转字符串中的单词剑指 Offer 58 - II. 左旋转字符串反转单词思路循环挪动子串和子串的拼接 344. 反转字符串 题目链接&#xff1a;344. 反转字符串 题目内容&#xff1a; 题目中重点强调了必须原地修改输入数组&#…

Java --- 异常处理

目录 一、什么是异常 二、异常抛出机制 三、如何对待异常 四、 Java异常体系 4.1、Throwable 4.2、Error 4.2、Exception 4.2.1、编译时异常 4.2.2、运行时期异常 五、异常处理 5.1、捕获异常&#xff08;try-catch&#xff09; 5.1.2、catch中异常处理方式 …

顺序表链表OJ题(1)——【LeetCode】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a; 今天我们来回顾一下顺序表与链表&#xff0c;针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习&#xff0c;这样才能巩固我们学习的内容。 话不多说&#xf…

C++:常成员变量、常成员函数、常对象

常成员变量: 1.用const修饰&#xff0c;可位于类型前后&#xff0c;若是成员变量类型为指针则只可位于类型后。 即&#xff1a;int *const p&#xff1b; 2.只能通过构造函数的初始化表对常成员变量进行初始化。 3.常成员所在类中的所有构造函数都必须对常成员变量初始化…

06.sqlite3学习——DQL(数据查询)(全)

目录 SQLite——DQL&#xff08;数据查询&#xff09; 数据集 select语句 条件查询 比较 确定范围 确定集合 like 查询记录 查询不重复的记录 排序和限制 排序 限制 聚合 聚合函数 语法 SQLite Group By详解 语法 实例 SQLite Having 子句 语法 实例 多…

浪潮云海护航省联社金融上云,“一云多芯”赋能数字农业

农村金融是现代金融体系的重要组成部分&#xff0c;是农业农村发展的重要支撑力量&#xff0c;而统管全省农商行及农信社的省级农村信用社联合社&#xff08;以下简称&#xff1a;省联社&#xff09;在我国金融系统中占据着举足轻重的地位。省联社通常采用“大平台小法人”的发…

Leetcode 2651.计算列车到站时间

给你一个正整数 arrivalTime 表示列车正点到站的时间&#xff08;单位&#xff1a;小时&#xff09;&#xff0c;另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实际到站的时间。 注意&#xff0c;该问题中的时间采用 24 小时制。 示例 1&#xff1a; 输入&…

计算机系统真题

计算机系统真题 考点计算机系统存储体系磁盘调度算法 考点 计算机系统 PC找到指令&#xff0c;存储到IR中 根据ID分析指令的操作&#xff0c;并执行指令,AR访问操作数 A pc存指令的地址 内存按照字节编址&#xff1a; 在统一单位&#xff0c;转换一下&#xff1a; 3x2的平方 …

飞腾E2000 UEFI使用设备树方式启动linux系统

以往我们使用uboot引导系统启动,是采用uboot引导设备树+内核+文件系统的方式。 那么使用UEFI如何通过设备树+内核+文件系统的方式进行引导呢?这篇文章主要就介绍了这种操作方法。 一、使用Buildroot交叉编译生成E2000 Linux系统 详细请参考嵌入式软件部提供的 E2000 Linux…

服务器部署前后端项目-SQL Father为例

hello~大家好哇&#xff0c;好久没更新博客了。现在来更新一波hhh 现在更新一下部署上的一些东西&#xff0c;因为其实有很多小伙伴跟我之前一样&#xff0c;很多时候只是开发了&#xff0c;本地前后端都能调通&#xff0c;也能用&#xff0c;但是没有部署到服务器试过&#x…

【FPGA零基础学习之旅#11】数码管动态扫描

&#x1f389;欢迎来到FPGA专栏~数码管动态扫描 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

React笔记(二)JSX

一、JSX JSX是javascript XML的简写&#xff0c;实际上是javascript的扩展&#xff0c;既有javascript的语法结构&#xff0c;又有XML的结构 1、JSX的规则要求 jsx必须要有一个根节点 如果不想产生无用的根标签&#xff0c;但是还要遵守JSX的语法的要求&#xff0c;可以使用…

Angular中使用drag and drop实现文件拖拽上传,及flask后端接收

效果&#xff1a;拖拽文件到组件上面时 边框变大变红 松手后发送到服务器(或者点击蓝字手动选择文件)并且把文件名显示在框内&#xff0c;美化还没做 html <div class"drapBox"><div id"drop" (dragenter)"dragenter($event)" (dragov…

AR界安卓在中国,Rokid引爆空间计算狂潮

击关注 文丨刘雨琦 你可能很难想象&#xff0c;在一个没有显示屏也没有鼠标的空间&#xff0c;仅凭一副AR眼镜和一台口袋主机&#xff0c;就能完成一篇5000字的文章。 没错&#xff0c;8月26日&#xff0c;在2023 Rokid Jungle 新品发布会现场&#xff0c;这样的场景正在真实…

前端如何走通后端接口

0 写在前面 现在基本都是前后端分离的项目了&#xff0c;那么前端小伙伴如何获取后端小伙伴接口呢&#xff1f; 1 条件 同一WiFi下&#xff0c;让后端小伙伴分享出自己的ip地址&#xff1a; 步骤1:winr调出运行界面 步骤2&#xff1a;cmd调出命令行窗口 步骤3&#xff1a;…