写在前面
本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定大数据理论体系
解答
ORC是专为Hadoop设计的自描述的列式存储格式(Apache Hive0.11版本引入),重点关注提高数据处理系统效率和降低数据存储空间。
它支持复杂数据类型、ACID及内置索引支持,非常适合海量数据的存储。
补充
特点
混合存储结构
先按行存储,一组行数据叫Stripes, Stripes内部按列存储。
ORCFile文件结构
ORCFile由stripe, footer和postscript三部分构成。
- stripe是数据存储单元,一定数目的行数据组成一个 stripe,每个 stripe大小约为250MB, stripe是一个逻辑处理单元,可由一个任务单独处理。 每个
stripe包含索引域、数据域和尾部域三部分,其中索引域记录每列最大值、最小值等信息,数据域以列为单位组织数据,尾部域存储了每列数据在数据域中的位置、编码方式等。 - footer记录了 ORC File文件主体的布局,包括 schema信息、行总数、每行的统计信息等。
- postscript记录了ORC文件级別的元信息,包括 footer长度、ORC版本号、采用的压缩算法等。
支持复杂数据类型
ORC是 Hortonworks公司为提高Hive处理效率和降低数据存储空间而设计的存储格式,它支持Hive所有数据类型,包括int、string、date等基本类型,也包括 struct、list、map和
union等复杂数据类型,尤其是对复杂数据类型的支持使得ORC能够定义非结构化的数据。
ORC以列为单位存储数据,并根据列的类型进行编码,比如对整数列采用变长编码和差值编码,对字符串采用字典编码等,列式存储与数据编码的引入,使得ORC文件可达到很高的压缩比。
尽管ORC已经独立成为一个 Apache项目,但由于它提供的编程API对复杂数据集(比如多层嵌套数据)不够友好,目前定义和创建ORC 文件主要是通过HQL( Hive Query Language)完成的。
基于数据类型的块模式压缩
Integer类型的列用行程长度编码(Run-Length Encoding,RLE);
String类型的列用字典编码。
支持ACID
Hive在 ORC File基础上,基于“base file+delta file”的模型实现了对ACID的支持,
即数据首先被写入一个 base file I中,之后的修改数据被写入一个 delta file,Hive将定期合并这两个文件。
但需要注意的是, Hive ORC ACID并不是为OLTP场景设计的,它能较好地支持一个事务中更新上百万(甚至更多)条记录,但难以应对一小时内上百万个事务的场景。
内置索引
ORC提供了file、 stripe以及row级别的索引,方便用户查找定位目标数据
- file级别索引:文件级别的统计信息(如最大值,最小值等);
- stripe级别索引:ORC文件将数据划分成若干个固定大小的 stripe,每个 stripe可定义记录内部数据统计信息;
- row级别索引:每个stripe内部每10000行会生成数据索引信息和统计信息。
ORC是按列存储数据的,支持投影操作,结合各级别索引,ORC可轻易过滤掉查询无关的数据行和数据列。ORC也允许用户根据自己的需要,在各级别索引中添加自定义信息。