一、关于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。结构如下图所示:



hive orc表压缩格式 hive orc文件存储格式_hive orc表压缩格式





如上图所示,在ORC文件中,每个Stripe包括索引数据、行数据及一个Stripe footerStripe 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的序列化与压缩的文档实在晦涩难懂,也没有找到更详细的说明材料,在此暂时不对其进行译解。