本文为自己翻译的译文,原文地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC
Version
Introduced in Hive version 0.11.0.
Optimized Row Columnar(ORC)文件格式提供了存储Hive数据的高效方法。它的设计是为了克服其他Hive文件格式的限制。使用ORC文件可以提高Hive在读取、写入和处理数据时的性能。
与RCFile格式相比,ORC文件格式有很多优点:
ORC文件包含称为stripes的行数据组,以及文件页脚中的辅助信息。在文件的末尾,一个postscript 保存了压缩参数和压缩页脚的大小。
默认的脚本大小为250MB。大的stripes可以大块的高效的从HDFS上读取。
文件页脚包含文件中的stripes 列表、每个stripes 的行数和每列的数据类型。它还包含列级的聚合计数、最小值、最大值和总和。
该图说明了ORC文件结构:
如上图所示,ORC文件中的每个strip都包含Index data,Row data和一个stripe footer。
stripe footer包含一个流位置目录。Row data用于表扫描。
Index data包括每个列的最小值和最大值,以及每个列中的行位置。(还可能包含一些字段或bloom过滤器。) 行索引项提供了偏移量可以找到正确的压缩块和在解压缩块后的字节。注意,ORC索引仅用于选择stripe footer和Row data,而不用于相应查询。
针对相对频繁的行索引使用,允许使用stripe可以进行多行跳过操作,从而实现快速读取,尽管有较大的条带大小。默认情况下,可以跳过10,000行。
由于基于谓词的筛选能够跳过大量行集,对一个表您可以在其第二主键上进行排序,从而大大减少执行时间。例如,如果主分区是事务日期,则可以根据状态、编码和姓氏对表进行排序。然后一次记录查找将跳过所有其他查询的记录。
ORC规范中给出了格式的完整规范。
File formats are specified at the table (or partition) level. 在表(或分区)级别指定文件格式。你可以使用HiveQL语句像这样指定ORC文件格式:
CREATE TABLE ... STORED AS ORC
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
SET hive.default.fileformat=Orc
TBLPROPERTIES里有所有参数(参见Create Table)中。他们是:
关键字 |
默认值 |
注释 |
---|---|---|
orc.compress |
ZLIB |
高度压缩 (one of NONE, ZLIB, SNAPPY) |
orc.compress.size |
262,144 |
每个压缩块中的字节数。 |
orc.stripe.size |
67,108,864 |
每个stripe块中的字节数。 |
orc.row.index.stride |
10,000 |
索引项之间的行数 (must be >= 1000) |
orc.create.index |
true |
是否创建行索引 |
orc.bloom.filter.columns | "" | 逗号分隔的列名列表,用于创建bloom过滤器。 |
orc.bloom.filter.fpp | 0.05 | 布隆过滤器的假阳性概率。 (must >0.0 and <1.0) |
例如,创建一个没有压缩的ORC存储表:
create table Addresses ( name string, street string, city string, state string, zip int ) stored as orc tblproperties ("orc.compress"="NONE");
Version 0.14.0+: CONCATENATE
ALTER TABLE table_name [PARTITION partition_spec] CONCATENATE
can be used to merge small ORC files into a larger file, starting in Hive 0.14.0. The merge happens at the stripe level, which avoids decompressing and decoding the data.
ORC文件中的列数据的序列化取决于数据类型是整数还是字符串。
整数列在两个流中序列化。
整数数据的序列化方式利用了数字的共同分布:
可变宽度编码是基于谷歌的协议缓冲区并使用高位来表示这个字节不是最后一个和较低的7位编码数据。为了编码负数,使用zigzag编码把0、-1、1、-2和2映射到0、1、2、3、4和5。
每组数字都是这样编码的:
在运行时长度编码中,第一个字节表示运行时长度和是否值为文字或重复值。重复的值是在-128之间+128。运行时长度编码使用protobuf 样式可变长度的整数。
字符串列的序列化使用字典来形成惟一的列值。字典被排序以加快谓词过滤和提高压缩比。
字符串列在四个流中序列化。
字典长度和行值都是运行长度编码的整数流。
流使用一个编解码器进行压缩的,编解码器被指定为该表中所有流的表属性。为了优化内存使用,在生成每个块时会进行增量地压缩。 压缩块可以跳过而无需先解压缩再进行扫描。流中的位置由块的开始位置和块中的偏移量决定。
编解码器可以是Snappy, Zlib, or none。
ORC文件转储工具分析ORC文件。要调用它,请使用以下命令:
// Hive version 0.11 through 0.14:
hive --orcfiledump
// Hive version 1.1.0 and later:
hive --orcfiledump [-d] [--rowindex
// Hive version 1.2.0 and later:
hive --orcfiledump [-d] [-t] [--rowindex
// Hive version 1.3.0 and later:
hive --orcfiledump [-j] [-p] [-d] [-t] [--rowindex
[--backup-path <
new
-path>]
|
在该命令中使用-d
,将导致它转储ORC文件数据而不是元数据(Hive 1.1.0和更高版本)。
使用--rowindex
指定逗号来分隔列id的列表将会打印指定列的行索引,其中0是包含所有列的顶层结构,1是第一列id(Hive 1.1.0 及更高版本支持).
在命令中使用 -t
将打印出写入器的时区id。
在命令中使用 -j
将以JSON格式打印ORC文件元数据。为了更好地打印JSON元数据,可以添加 -p
到命令中。
在命令中使用 --recover
将恢复由Hive流生成的损坏的ORC文件。
在命令中将 --skip-dump
和 --recover
一起使用将在不转储元数据的情况下执行恢复。
在命令中使用 --backup-path
指定一个新的备份路径,恢复工具会将已损坏的文件移动到指定的备份路径(默认:/tmp)。
ORC配置参数在Hive Configuration Properties – ORC File Format有详细描述。
ORC 格式说明文档已经移到 ORC project
.