本文为自己翻译的译文,原文地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC
ORC File Format
Version
Introduced in Hive version 0.11.0.
Optimized Row Columnar(ORC)文件格式提供了存储Hive数据的高效方法。它的设计是为了克服其他Hive文件格式的限制。使用ORC文件可以提高Hive在读取、写入和处理数据时的性能。
与RCFile格式相比,ORC文件格式有很多优点:
- 单个文件作为每个任务的输出,它减少了NameNode的负载。
- Hive类型支持,包括datetime、decimal和复杂类型(struct、list、map和union)
- 在文件中存储轻量级索引
- 跳过不通过谓词过滤的行组
- 寻找一个给定的行
- 基于数据类型的块模式压缩
- 整数列的运行长度编码
- 对字符串列的字典编码
- 使用单独的记录阅读器并发读取相同的文件
- 能够不扫描标记分割文件
- 限制读写所需的内存
- 使用协议缓冲区存储的元数据,允许添加和删除字段
文件结构
ORC文件包含称为stripes的行数据组,以及文件页脚中的辅助信息。在文件的末尾,一个postscript 保存了压缩参数和压缩页脚的大小。
默认的脚本大小为250MB。大的stripes可以大块的高效的从HDFS上读取。
文件页脚包含文件中的stripes 列表、每个stripes 的行数和每列的数据类型。它还包含列级的聚合计数、最小值、最大值和总和。
该图说明了ORC文件结构:
Stripe 结构
如上图所示,ORC文件中的每个strip都包含Index data,Row data和一个stripe footer。
stripe footer包含一个流位置目录。Row data用于表扫描。
Index data包括每个列的最小值和最大值,以及每个列中的行位置。(还可能包含一些字段或bloom过滤器。) 行索引项提供了偏移量可以找到正确的压缩块和在解压缩块后的字节。注意,ORC索引仅用于选择stripe footer和Row data,而不用于相应查询。
针对相对频繁的行索引使用,允许使用stripe可以进行多行跳过操作,从而实现快速读取,尽管有较大的条带大小。默认情况下,可以跳过10,000行。
由于基于谓词的筛选能够跳过大量行集,对一个表您可以在其第二主键上进行排序,从而大大减少执行时间。例如,如果主分区是事务日期,则可以根据状态、编码和姓氏对表进行排序。然后一次记录查找将跳过所有其他查询的记录。
ORC规范中给出了格式的完整规范。