一、关于ORC文件格式( ORC从Hive0.11开始引入)
ORC(Optimized Row Columnar)格式可以高效地存储Hive数据,被设计用来规避其他文件格式存在的缺陷,使用ORC文件格式可以提升Hive读、写与处理数据的性能。ORC文件格式有以下优点:
1、一个任务的输出对应一个文件,从而减轻Namenode的负载压力
2、Hive可以支持datetime,decimal和其他复杂类型(包括struct,list,map,union)
3、使用存储在文件中的轻型索引,可以
(1)跳过那些没有经过预复选的行
(2)定位指定的行
4、基于数据类型的块模式压缩
(1)对于整数列使用行程长度编码
(2)对于字串列使用字典编码
5、使用分离的RecordReaders对同一文件并行读
6、不使用标签(markers)就可以Split文件
7、为读写操作固定所需的内存
8、元数据存储在协议缓冲区(Protocol Buffers),它允许增加或者删除一些列
二、文件结构
一个ORC文件包含多个stripes(每个stripes由多组行数据组成的),一个包含辅助信息的file footer。在文件的结尾,一个postscript保存着压缩参数及被压缩的footer的长度。一个stripes缺省大小是250MB,其大小可以扩展的长度只受HDFS的约束。file footer包含文件中的一个记录stripes信息的列表、每个stripes中行的数目及每个列的数据类型,它也包含列级的聚合结果:count, min, max, and sum。结构如下图所示:
如上图所示,在ORC文件中,每个Stripe包括索引数据、行数据及一个Stripe footer。Stripe footer包含了用于流定位的目录,Row data用于表扫描。索引数据(Indexdata)包括每个列的最小与最大值,以及它们在每个列的行号,行索引项(Rowindex entries)记录了压缩块及解压后字节的偏移。需要注意的是,ORC索引只是被用来选择Stripe和行组,而不会被用于返回查询结果。拥有相对频繁的行索引条目,可以为了快速的数据读取而跳过一些行,缺省情况下每次最多可以跳过10000行。ORC有能力基于过滤谓词跳过非常多的行,可以使用第二关键字进行对表进行排序,以达到减少查询执行时间的效果。例如,如果主关键字是交易日期,表可以按照州、邮编或者姓名进行排序,当按照州查询记录的时候将跳过非目标州的记录。
三、使用ORC的HiveQL语法
可以在表级或者分区级指定文件的格式,对表或分区设置ORC格式的HiveQL命令示例如下
-
CREATE TABLE ... STORED AS ORC
-
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
-
SET hive.default.fileformat=Orc
ORC格式的参数通过TBLPROPERTIES来指定,支持的参数有:
关键字 | 缺省值 | 说明 |
orc.compress | ZLIB | 压缩方法(NONE, ZLIB, SNAPPY) |
orc.compress.size | 262,144 | 每个压缩块的字节数 |
orc.stripe.size | 268435456 | 每个stripe的字节数 |
orc.row.index.stride | 10,000 | 索引项之间的行数(number of rows between index entries),至少为1000 |
orc.create.index | true | 是否创建行索引 |
下面的例子创建了一个没有压缩的ORC格式表:
create table Addresses (
name string,
street string,
city string,
state string,
zip int
) stored as orc tblproperties ("orc.compress"="NONE");
注:关于ORC的序列化与压缩的文档实在晦涩难懂,也没有找到更详细的说明材料,在此暂时不对其进行译解。