写在前面

本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定大数据理论体系

解答

ORC是专为Hadoop设计的自描述的列式存储格式(Apache Hive0.11版本引入),重点关注提高数据处理系统效率和降低数据存储空间。
它支持复杂数据类型、ACID及内置索引支持,非常适合海量数据的存储。

补充

特点

混合存储结构

先按行存储,一组行数据叫Stripes, Stripes内部按列存储。

ORCFile文件结构

ORCFile由stripe, footer和postscript三部分构成。

ORCFile文件结构

  1. stripe是数据存储单元,一定数目的行数据组成一个 stripe,每个 stripe大小约为250MB, stripe是一个逻辑处理单元,可由一个任务单独处理。 每个
    stripe包含索引域、数据域和尾部域三部分,其中索引域记录每列最大值、最小值等信息,数据域以列为单位组织数据,尾部域存储了每列数据在数据域中的位置、编码方式等。
  2. footer记录了 ORC File文件主体的布局,包括 schema信息、行总数、每行的统计信息等。
  3. 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级别的索引,方便用户查找定位目标数据

  1. file级别索引:文件级别的统计信息(如最大值,最小值等);
  2. stripe级别索引:ORC文件将数据划分成若干个固定大小的 stripe,每个 stripe可定义记录内部数据统计信息;
  3. row级别索引:每个stripe内部每10000行会生成数据索引信息和统计信息。

ORC是按列存储数据的,支持投影操作,结合各级别索引,ORC可轻易过滤掉查询无关的数据行和数据列。ORC也允许用户根据自己的需要,在各级别索引中添加自定义信息。

Q.E.D.


大数据开发工程师,精通 Spark,擅长 Java 和 Scala