列式存储 Parquet

1.  最初创建Parquet的目的是:要在Hadoop生态系统中,充分利用数据压缩、有效列式存储的优势。Parquet面向复杂的嵌套数据结构,使用Dremel中的record shredding and assembly算法,其与简单命名空间嵌套的方法相比更加高效。Parquet支持有效的数据压缩和编码方式,甚至允许为不同列单独设置压缩方式。

2. 名词术语:block(数据块)、file(文件)、column chunk(列块):将数据按列存储时,每一列数据被分割成多个列块、row group(行组):每一列一个列块组合起来就构成行组、page(页):每一个列块被分割成很多页,页是压缩和编码的最小单元。分层次来看,Parquet中的一个文件包含一个或者多个行组,一个行组包含多个列块且每一列仅对应一个列块,每个列块包含一个或者多个页。

3. 元数据(metadata):Parquet包括3种类型的元数据,文件元数据、列块元数据和页元数据。

Parquet支持的原始数据类型有:1个bit的BOOLEAN、32个bit的INT32、64个bit的INT64、96个bit的INT96、32个bit的FLOAT、64个bit的DOUBLE、任意长度的字节数组BYTE_ARRAY。为了拓展原始数据类型,Parquet引入了逻辑类型,指定原始数据类型的解读方式。例如:字符串被保存为一个包含UTF8编码注解(annotation)的字节数组,注解定义了如何解读保存成原始数据类型的数据。注解在文件元数据中,被保存为一个ConvertedType类型的对象,在文档LogicalTypes.md中有逻辑类型注解的说明。

为了编码嵌套的列,Parquet引入了Dremel编码机制:加入了列定义深度以及列重复元素深度的概念。列定义深度指定到当前列元素的字段路径中,有值的可选(optional)字段的数量;列重复元素深度记录该重复出现的列元素的深度。从记录的数据中,可以计算出最大列定义深度和最大列重复元素深度。

空值被编码在列定义深度中,不会额外的存储空值。

时间: 2024-12-08 12:03:01

列式存储 Parquet的相关文章

开源列式存储引擎Parquet和ORC

转载自董的博客 相比传统的行式存储引擎,列式存储引擎具有更高的压缩比,更少的IO操作而备受青睐(注:列式存储不是万能高效的,很多场景下行式存储仍更加高效),尤其是在数据列(column)数很多,但每次操作仅针对若干列的情景,列式存储引擎的性价比更高. 在互联网大数据应用场景下,大部分情况下,数据量很大且数据字段数目很多,但每次查询数据只针对其中的少数几行,这时候列式存储是极佳的选择,目前在开源实现中,最有名的列式存储引擎是Parquet和ORC,在最近一年内,它们都晋升为Apache顶级项目,可

网易视频云:新一代列式存储格式Parquet

网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PAAS服务,在线教育.远程医疗.娱乐秀场.在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台.现在,网易视频云的技术专家给大家分享一则技术文: 新一代列式存储格式Parquet. Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop.Spark等),被

几张图看懂列式存储

最近看到一篇很好资料,里面三言两语配上几个图就把列式存储(Column-based Storage)讲明白了,牛啊!最喜欢的就是这种浅显易懂就把背景知识讲得明明白白,而不是长篇大论的讲概念. 1 为什么要按列存储 列式存储(Columnar or column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的.简单来说两者的区别就是如何组织表(翻译不好,直接抄原文了): Row-based storage stores atable in a sequen

列式存储设计实战

背景: 开发个学生系统,数据库设计. 设计实施: 传统数据库学生表行设计 学号 姓名 性别 年龄 1 张三 男 16 2 李红 女 15 3 王五 男 16 当想扩展属性时,相对应的会增加字段. 学号 姓名 性别 年龄 住址 1 张三 男 16 河南 2 李红 女 15 湖北 3 王五 男 16 北京 实际开发中这样做的缺点: 1:属性字段向主表加,会导致列越来越多,增加表拆分成本. 2:  增加字段,程序中实体模型,SQL查询字段,DTO及文档数据模型都要跟着发生变化,增加成本. 3:查询单个

内存列式存储 vs Buffer Cache

Oracle DB 12c的In-Memory选项(DBIM)将表中列的所有行的数据载入内存,为何不能像Buffer Cache那样只把频繁访问的数据块置入内存中呢? 内存列式存储和Buffer Cache的访问模式 原因是两者支持的访问模式不同,对于Buffer Cache,支持的是OLTP应用,访问模式为non-uniform access patterns,也就是说表中的某些行访问比其它行频繁,因此才能通过只缓存10%的数据,就可以涵盖95%的数据访问.可以假设缓存10%的数据就可以得到2

Infobright列式存储数据库

Infobright 是一个非常强大的列式存储数据库,基于MySQL的高效数据仓库. 之所以使用数据仓库,是因为目前MySQL数据库中的数据增长很快,定期会对一些历史记录表进行清除,但后期的统计分析还会用到这些历史数据,随着数据量的增大,查询也越来越慢,而数据库仓库特有的存储格式能够减小磁盘空间内的占用,同时列式的特点使得查询速度大为改观.选择Infobright是因为它锁支持的数据类型更多些,更接近于mysql,更节省磁盘空间,毕竟主要的统计查询还不是在数据仓库上,偶尔的查询一下速度倒不是要求

hbase kv特性 列式存储 查询接口

KV数据库: 只是key有多个层级: 表 + rowkey + column family + column 可以扫一个表的所有记录, 可以查一个表内,一个rowkey的所有column family + column对应value 可以查一个表内,一个rowkey,一个column family 内所有column对应value 可以查一个表内,一个rowkey,一个column family ,一个column对应的value 列式存储: 定义hbase表的时候,只需要知道table名和哪几

内存列式存储

内存列式存储(IM column store)(此特性在12cr1(12.1.0.2)版本后开始可用)是系统全局区中一个可选的部分,表中的数据是以列的形式而不是行的形式存储在内存里面的,如下图所示.在针对某列作查询的应用场景中,列式存储能极大地提升语句的执行速度. IM的列存储在SGA中一个新的静态池.传统的表数据是以行为单位存储,列作为行的一个个片断,列式存储是以一种新的列格式.每个列被存储为一个单独的结构.列存储区不取代缓冲区缓存,但作为一个补充,使数据可以存储在内存中的行和列格式.要使用列

oracle 12c 列式存储 ( In Memory 理论)

随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以查询为主的OLAP应用.in memory组件可以和其他数据库组件功能使用,并不需要用户单独开发或者修改应用程序,就可以非常方便的实现基于实时数据库分析的转变.本文会介绍in memory组件的一些相关知识,包含了以下的内容: -列式存储的基本知识 -访问in memory area中的数据 -In