[Hive]-列式存储篇

1. ORC是什么

  ORC,全称 Optimized Row Columnar.是Hadoop生态圈的列式存储概念,最早由Hive提出.\

  在Hive的ORC,首先依然是根据行组分割整个表,但是在每个行组中,按列存储.ORC文件是自描述的,它的元数据使用Protocol Buffers进行序列化,并尽可能的进行压缩

2.ORC的好处

  列式存储有很高的压缩比.(因为同列数据,数据格式,重复率等相同几率很高,并且可以针对列相同的数据类型,采用更好的压缩方式)

  优化查询效率(可以只查询某些需要的列而不用扫整个数据,降低IO)

  提供了多种索引()row group index、bloom filter index等),并且可以保存列本身的统计信息(Min,Max,Sum等),对部分查询谓词效率更高

  可以支持更为复杂的数据结构.比如Map,或者更加不规则的数据结构

3.存储结构

  Hive.ORC中,数据以二进制文件存储,所以是不可以直接阅读的,而元数据是随同ORC一起的,所以是自解析的.具体如下:

  ORC文件:保存在HDFS的普通二进制文件,每一个ORC文件包含多个stripe,每一个stripe包含多条数据.针对每一个stripe,进行列式存储.

  ORC文件级元数据:包含整个ORC文件的描述信息,文件Meta和统计信息,所有在此ORC文件的stripe信息和文件的shemale信息,保存在文件的末尾.

  stripe:一组行形成一个stripe,读写的最小单位(每次读写至少读取一个stripe),一般为HDFS的一个块大小,保存了每一列的索引和数据

  stripe元数据:保存stripe的位置,每一个列在本stripe的统计信息以及所有Stream信息

  row group:行组. 索引化的最小单位,一个stripe包含多个row group

  stream:一个stream表示文件中有效的一段.包括索引和数据两类。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体需要哪几种是由该列类型和编码方式决定

4.索引统计

  ORC文件中包含三个级别的统计信息,ORC,stripe,row group级.用于在某些查询时指示是否可以跳过某段数据,或直接得出某些统计结果等

    ORC级  ORC文件的末尾记录,整个文件的列统计信息,

    stripe级  ORC文件还会记录,每个stripe的列统计信息.

    row group级 ORC文件还会记录,每个行组的列统计信息.(行组的范围可以指定,默认10000)

  主要用于查询的优化.比如谓词a>4 && a<10时,当查询到ORC或者stripe或者行组的A列统计最小为11或者最大为3时就不会读入,将整个跳过该ORC或者stripe或者行组.  

5.数据读取方式

  ORC文件从末尾开始读取.文件的最后一个字节存储的Postscript长度.Postscript长度不会超过256个字节,Postscript存储的是整个文件的元数据信息.包括文件的压缩格式,每一个文件块的最大长度(读取时的内存分配),Foot长度,以及一些版本信息.

  参考资料 https://www.cnblogs.com/ITtangtang/p/7677912.html

原文地址:https://www.cnblogs.com/NightPxy/p/9129499.html

时间: 2024-10-29 05:11:53

[Hive]-列式存储篇的相关文章

几张图看懂列式存储

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

开源列式存储引擎Parquet和ORC

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

几张图看懂列式存储(转)

add by zhj: 终于明白了什么是列式存储,什么是行式存储.这跟数据在存储介质中的存储结构有关, 列式存储是指,一列中的数据在存储介质中是连续存储的:行式存储是指一行中的数据在存储介质 中是连续存储的. 原文:http://blog.csdn.net/dc_726/article/details/41143175 最近看到一篇很好资料,里面三言两语配上几个图就把列式存储(Column-based Storage)讲明白了,牛啊!最喜欢的就是这种浅显易懂就把背景知识讲得明明白白,而不是长篇大

你应该知道一些其他存储——列式存储

导读:在讲<Apache Druid 底层存储设计>时就说过要讲一讲列式存储.现在来了,通过本文你可以了解到行存储模式.列存储模式.它们的优缺点以及列存储模式的优化等知识. 今日格言:不要局限于单向思维,多对比了解更多不同维度的东西. 从数据存储讲起 我们最先接触的数据库系统,大部分都是行存储系统.大学的时候学数据库,老师让我们将数据库想象成一张表格,每条数据记录就是一行数据,每行数据包含若干列.所以我们对大部分数据存储的思维也就是一个复杂一点的表格管理系统.我们在一行一行地写入数据,然后按查

列式存储设计实战

背景: 开发个学生系统,数据库设计. 设计实施: 传统数据库学生表行设计 学号 姓名 性别 年龄 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中一个新的静态池.传统的表数据是以行为单位存储,列作为行的一个个片断,列式存储是以一种新的列格式.每个列被存储为一个单独的结构.列存储区不取代缓冲区缓存,但作为一个补充,使数据可以存储在内存中的行和列格式.要使用列