[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