推广

parquet和orc

iseeyu3年前 (2023-11-16)推广165

压缩比

image.png

转自:http://lxw1234.com/archives/2016/04/630.htm

一、Parquet

1、Parquet存储模型

Parquet文件是自解析的,文件中包括该文件的数据和元数据。在HDFS文件系统和Parquet文件中存在如下几个概念:
1)HDFS块(Block):它是HDFS上的最小的副本单位,HDFS会把一个Block存储在本地的一个文件并且维护分散在不同的机器上的多个副本,通常情况下一个Block的大小为256M、512M等。
2)HDFS文件(File):一个HDFS的文件,包括数据和元数据,数据分散存储在多个Block中。
3)行组(Row Group):按照行将数据物理上划分为多个单元,每一个行组包含一定的行数,在一个HDFS文件中至少存储一个行组,Parquet读写的时候会将整个行组缓存在内存中,所以如果每一个行组的大小是由内存大的小决定的。
4)列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。不同的列块可能使用不同的算法进行压缩。
5)页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

Parquet文件的格式如下图所示:

parquet文件格式

可以看出,存储格式中元数据索引信息是被存储在最后的,所以当读取某一行的数据的时候,就需要去定位最后的索引信息,最后才能去读取对应的行数据。元数据包括 Parquet 原始类型定义、Page类型、编码类型、压缩类型等等。

2、Parquet数据模型

Parquet 支持嵌套结构的数据模型,而非扁平式的数据模型,这是 Parquet 相对其他列存比如 ORC 的一大特点或优势。支持嵌套式结构,意味着 Parquet 能够很好的将诸如 Protobuf,thrift,json 等对象模型进行列式存储。
Parquet 的数据模型也是 schema 表达方式,用关键字 message 表示。每个字段包含三个属性,repetition属性(required/repeated/optional)、数据类型(primitive基本类型/group复杂类型)及字段名。如:

parquet数据模型

二、Orc

1、文件结构

和Parquet类似,ORC文件也是以二进制方式存储的,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。ORC的文件结构如下图,其中涉及到如下的概念:
ORC文件:保存在文件系统上的普通二进制文件,一个ORC文件中可以包含多个stripe,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row
group的概念。
文件级元数据:包括文件的描述信息PostScript、文件meta信息(包括整个文件的统计信息)、所有stripe的信息和文件schema信息。
stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为HDFS的块大小,保存了每一列的索引和数据。
stripe元数据:保存stripe的位置、每一个列的在该stripe的统计信息以及所有的stream类型和位置。
row group:索引的最小单位,一个stripe中包含多个row group,默认为10000个值组成。
stream:一个stream表示文件中一段有效的数据,包括索引和数据两类。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体需要哪几种是由该列类型和编码方式决定。

在ORC文件中保存了三个层级的统计信息,分别为文件级别、stripe级别和row group级别的,他们都可以用来根据Search ARGuments(谓词下推条件)判断是否可以跳过某些数据,在统计信息中都包含成员数和是否有null值,并且对于不同类型的数据设置一些特定的统计信息。

  1. file level

    在ORC文件的末尾会记录文件级别的统计信息,会记录整个文件中columns的统计信息。这些信息主要用于查询的优化,也可以为一些简单的聚合查询比如max, min, sum输出结果。

  2. stripe level

    ORC文件会保存每个字段stripe级别的统计信息,ORC reader使用这些统计信息来确定对于一个查询语句来说,需要读入哪些stripe中的记录。比如说某个stripe的字段max(a)=10,min(a)=3,那么当where条件为a >10或者a <3时,那么这个stripe中的所有记录在查询语句执行时不会被读入。

  3. row level

    为了进一步的避免读入不必要的数据,在逻辑上将一个column的index以一个给定的值(默认为10000,可由参数配置)分割为多个index组。以10000条记录为一个组,对数据进行统计。Hive查询引擎会将where条件中的约束传递给ORC reader,这些reader根据组级别的统计信息,过滤掉不必要的数据。如果该值设置的太小,就会保存更多的统计信息,用户需要根据自己数据的特点权衡一个合理的值。

2、数据访

读取ORC文件是从尾部开始的,第一次读取16KB的大小,尽可能的将Postscript和Footer数据都读入内存。文件的最后一个字节保存着PostScript的长度,它的长度不会超过256字节,PostScript中保存着整个文件的元数据信息,它包括文件的压缩格式、文件内部每一个压缩块的最大长度(每次分配内存的大小)、Footer长度,以及一些版本信息。在Postscript和Footer之间存储着整个文件的统计信息(上图中未画出),这部分的统计信息包括每一个stripe中每一列的信息,主要统计成员数、最大值、最小值、是否有空值等。

接下来读取文件的Footer信息,它包含了每一个stripe的长度和偏移量,该文件的schema信息(将schema树按照schema中的编号保存在数组中)、整个文件的统计信息以及每一个row group的行数。

处理stripe时首先从Footer中获取每一个stripe的其实位置和长度、每一个stripe的Footer数据(元数据,记录了index和data的的长度),整个striper被分为index和data两部分,stripe内部是按照row group进行分块的(每一个row group中多少条记录在文件的Footer中存储),row group内部按列存储。每一个row group由多个stream保存数据和索引信息。每一个stream的数据会根据该列的类型使用特定的压缩算法保存。在ORC中存在如下几种stream类型:

PRESENT:每一个成员值在这个stream中保持一位(bit)用于标示该值是否为NULL,通过它可以只记录部位NULL的值
DATA:该列的中属于当前stripe的成员值。
LENGTH:每一个成员的长度,这个是针对string类型的列才有的。
DICTIONARY_DATA:对string类型数据编码之后字典的内容。
SECONDARY:存储Decimal、timestamp类型的小数或者纳秒数等。
ROW_INDEX:保存stripe中每一个row group的统计信息和每一个row group起始位置信息。

在初始化阶段获取全部的元数据之后,可以通过includes数组指定需要读取的列编号,它是一个boolean数组,如果不指定则读取全部的列,还可以通过传递SearchArgument参数指定过滤条件,根据元数据首先读取每一个stripe中的index信息,然后根据index中统计信息以及SearchArgument参数确定需要读取的row group编号,再根据includes数据决定需要从这些row group中读取的列,通过这两层的过滤需要读取的数据只是整个stripe多个小段的区间,然后ORC会尽可能合并多个离散的区间尽可能的减少I/O次数。然后再根据index中保存的下一个row group的位置信息调至该stripe中第一个需要读取的row group中。

ORC文件格式只支持读取指定字段,还不支持只读取特殊字段类型中的指定部分。

使用ORC文件格式时,用户可以使用HDFS的每一个block存储ORC文件的一个stripe。对于一个ORC文件来说,stripe的大小一般需要设置得比HDFS的block小,如果不这样的话,一个stripe就会分别在HDFS的多个block上,当读取这种数据时就会发生远程读数据的行为。如果设置stripe的只保存在一个block上的话,如果当前block上的剩余空间不足以存储下一个strpie,ORC的writer接下来会将数据打散保存在block剩余的空间上,直到这个block存满为止。这样,下一个stripe又会从下一个block开始存储。

由于ORC中使用了更加精确的索引信息,使得在读取数据时可以指定从任意一行开始读取,更细粒度的统计信息使得读取ORC文件跳过整个row group,ORC默认会对任何一块数据和索引信息使用ZLIB压缩,因此ORC文件占用的存储空间也更小,这点在后面的测试对比中也有所印证。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57036.html

相关文章

教你企业网站设计应该注意的七大问题是什么。

教你企业网站设计应该注意的七大问题是什么。

企业网站的好坏是如何判定的呢?本文觉得要从各方面的细节设计来决定是否成功或失败。那么,从哪些细节方面做好后,才能使网站的效果发挥的更好好,成为一个优秀合格的网站呢。 1、主题明确内容合理定位准确 不管我们建设什么类型的网站,首先要将主题明确下来,然后定位好目标使用人群,在加上网站中内容...

小编分享杭州网络营销公司简述网络营销的八大策略_网络营销常见问题。

小编分享杭州网络营销公司简述网络营销的八大策略_网络营销常见问题。

公司简述网络营销的八大策略 网络营销策略是指企业根据自身特点进行的一些网络营销组合,与基本的营销手段有一些差异,良好的网络营销策略会给企业或网站带来巨大的回报。我先根据自己的经验给大家说说什么是网络营销,简单的说网络营销就是在互联网营造一种在线营销环境,它注重经验的总结和执行的技巧,不用太高...

[seo网站推广]单页面网站的推广引流技巧有哪些

[seo网站推广]单页面网站的推广引流技巧有哪些

单页面网站优化,顾名思义就是网站独立的一个页面SEO,全站只有一个页面,通常来说应用于竞价推广。那么,单页面网站的推广引流技巧有哪些呢,总结以下几点: 单页网站的推广引流技巧1.适合论坛推广引流,将网站的链接发布到一些行业比较接近的论坛,在论坛中要体现自己的专业性,注重质量,帖子会一直存活,然后...

企业网站优化过程中需要注意哪些问题。

企业网站优化过程中需要注意哪些问题。

现在很多的企业开始建设自己的网站,一般建立自己的网站一段时间后,会有一些问题,此时网站需要修订来适应发展。那企业网站优化过程中需要注意哪些问题? 第一,网站修订达到了什么程度。一些网站在建设和运营一段时间后,网站管理员或企业负责人会感觉不好,同时会提出修订的要求。修订有两种情况,...

企业网站SEO营销要怎样做关键词排名。

企业网站SEO营销要怎样做关键词排名。

伴随互联网行业的发展,现在很多的企业开始做搜索引擎优化,而今做网络SEO排名的方式技巧都有很多,而今做网站推广营销要在搜索引擎中获得靠前的排名,站长们还得从网站优化细节着手,那么企业网站SEO营销要怎样做关键词排名? 1、站内结构优化 一个好的网站站内结构能够为网站吸引到更多的流量,同...

网站seo服务权重提高的方法。

网站seo服务权重提高的方法。

SEO服务网络时代已经是快餐时代,大部分内容的更新和变化都是非常快。搜索引擎仅仅依靠网站的访问历史来赋予权重的时代已经结束了。现在,一些老网站的seo优化优势变得不像以前那么明显了。特别是没有网站吸引新用户,会逐渐在搜索引擎上失去权重。第一步:严格遵守搜索引擎的收录和排名规则来开发网站这是一个常见的...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片