Hive ORC

ORC是RCfile的优化版本

关于Hive的文件格式

  • TEXTFILE
    默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。源文件可以直接通过hadoop fs -cat 查看
  • SEQUENCEFILE
    一种Hadoop API提供的二进制文件,使用方便、可分割、可压缩等特点。SEQUENCEFILE将数据以<key,value>的形式序列化到文件中。
  • RCFILE
    一种行列存储相结合的存储方式。首先,其将数据按行分块。其次,块数据列式存储,有利于数据压缩和快速的列存取。
    《Hive ORC》 按行划分
    HDFS Blocks是16字节的HDFS同步块信息,主要包括该行组内的存储的行数、列的字段信息等等。优势 在一般的行存储中 select a from table,虽然只是取出一个字段的值,但是还是会遍历整个表,所以效果和select * from table 一样,在RCFile中,像前面说的情况,只会读取该行组的一行。
    《Hive ORC》 按列存储
    在一般的列存储中,会将不同的列分开存储,这样在查询的时候会跳过某些列,但是有时候存在一个表的有些列不在同一个HDFS块上(如下图),所以在查询的时候,Hive重组列的过程会浪费很多IO开销。
    劣势 拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。
  • ORC hive给出的新格式,属于RCFILE的升级版。
    《Hive ORC》 ORC详细格式
Postscripts中存储该表的行数,压缩参数,压缩大小,列等信息
Stripe Footer中包含该stripe的统计结果,包括Max,Min,count等信息
FileFooter中包含该表的统计结果,以及各个Stripe的位置信息
IndexData中保存了该stripe上数据的位置信息,总行数等信息
RowData以stream的形式保存了数据的具体信息

《Hive ORC》 数据读取流程图

Hive读取数据的时候,根据FileFooter读出Stripe的信息,根据IndexData读出数据的偏移量从而读取出数据。

ORC文件不仅仅是一种列式文件存储格式,最重要的是有着
很高的压缩比,并且对于MapReduce来说是
可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅可以很大程度的节省HDFS存储资源,而且对数据的查询和处理性能有着非常大的提升,因为ORC较其他文件格式压缩比高,查询任务的输入数据量减少,使用的Task也就减少了。

查看ORC文件信息

建表时指定使用ORC存储方式,注意需要将ORC的表中的NULL取值,由默认的\N改为’ ‘

CREATE TABLE ... STORED AS ORC
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
SET hive.default.fileformat=Orc

STORED AS ORC为例介绍相关的实验参数

create table Addresses (
  name string,
  street string,
  city string,
  state string,
  zip int
) stored as orc tblproperties ("orc.compress"="NONE");
参数(在在Hive QL语句的tblproperties字段里面出现):
Key                           Default               Notes
orc.compress                  ZLIB       high level compression (one of NONE, ZLIB, SNAPPY)
orc.compress.size             262,144    number of bytes in each compression chunk
orc.stripe.size               268435456  number of bytes in each stripe
orc.row.index.stride          10,000     number of rows between index entries (must be >= 1000)
orc.create.index              true       whether to create row indexes

查看ORC存储方式

hive --orcfiledump <location-of-orc-file>
例子:库名,表名:fileformat.db,test_orc
hive --orcfiledump /user/hive/warehouse/fileformat.db/test_orc/000000_0

查询结果如下所示:

《Hive ORC》 ORC展示结果

将临时表导入到ORC表中

insert overwrite table http_orc partition(dt='2013-09-30') select p_id,tm,idate,phone from tmp_testp where dt='2013-09-30'

直接load文本的方式use search_index; load data local inpath '\$data_dir/category_en.txt' into table \${table_name} partition(dt='${table_dt}因为ORC类似于索引的统计结构,不适用。

    原文作者:analanxingde
    原文地址: https://www.jianshu.com/p/36e4f0137744
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞