[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