ORC文件
一、ORC储存格式
ORC的全称是(Optimized Record Columnar),优化后的列式记录,ORC在RCFile的基础上进行了一定的改进,所以与RCFile相比,具有以下一些优势:
- ORC中的特定的序列化与反序列化操作可以使ORC file writer根据数据类型进行写出。
- 提供了多种RCFile中没有的indexes,这些indexes可以使ORC的reader很快的读到需要的数据,并且跳过无用数据,这使得ORC文件中的数据可以很快的得到访问。
- 由于ORC file writer可以根据数据类型进行写出,所以ORC可以支持复杂的数据结构(比如Map, Struct等)。
- ORC的stripe默认大小更大,为ORC writer提供了一个memory manager来管理内存使用情况。
二、ORC数据存储方法
在ORC格式的hive表中,数据首先会被按照行切分成多个stripes,之后在每个stripe内数据按列为单位进行存储,所有列的内容都保存在同一个文件中。每个stripe的大小默认为256MB, 与RCFile的4MB的stripe相比, ORC格式的文件读取更加高效。
对于复杂的数据类型,比如Map,ORC文件会将一个复杂数据类型字段解析成多个子字段。如下表所示:
date type | child columns |
---|---|
Array | 一个包含数组所有元素的子字段 |
Map | 两个子字段,一个key字段,一个value字段 |
Struct | 每一个属性对应一个子字段 |
Union | 每一个属性对应一个子字段 |
当字段类型都被解析后,会由这些字段类型组成一个字段树,只有树的叶子节点才会保存表数据,这些叶子节点中的数据形成一个数据流,如上图中的Data Stream。
为了使ORC文件的reader更加高效的读取数据,字段的metadata会保存在Meta Stream中。在字段树中,每一个非叶子节点记录的就是字段的metadata,比如对一个array来说,会记录它的长度。下图根据表的字段类型生成了一个对应的字段树。
参考资料
http://lxw1234.com/archives/2016/04/630.htm