无情 @ 2016-01-13 15:42:48 阅读(6804)
hive


hive文件存储格式和创建语句

hive文件存储格式包括以下几类:


1、TEXTFILE


2、SEQUENCEFILE


3、RCFILE


4、ORCFILE(0.11以后出现)


其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;

SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。


1:TEXTFILE格式


默认格式,数据不做压缩,磁盘开销大,数据解析开销大。

可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,

从而无法对数据进行并行操作。


创建一张表user_info_t

create table if not exists user_info_t(id bigint,username string,password string,sex string) row format delimited fields terminated by '\t' stored as textfile;
load data local inpath '/root/userinfo.txt'  into table user_info_t;

(userinfo.txt内容如下一共有74w左右的数据)

1 u1 p1

2 u2 p2

3 u3 p3

4 u4 p4




2:SEQUENCEFILE格式

SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。


create table if not exists user_info_seq(id bigint,username string,password string,sex string) row format delimited fields terminated by '\t' stored as sequencefile;

insert overwrite table user_info_seq select * from user_info_t;



3:RCFILE格式

RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

create table if not exists user_info_rc(id bigint,username string,password string,sex string) row format delimited fields terminated by '\t' stored as rcfile;
insert overwrite table user_info_rc select * from user_info_t;


4:ORC格式

  Orcfile(Optimized Row Columnar)是hive 0.11版里引入的新的存储格式,是对之前的RCFile存储格式的优化.

  可以看到每个Orc文件由1个或多个stripe组成,每个stripe250MB大小,这个Stripe实际相当于之前的rcfile里的RowGroup概念,不过大小由4MB->250MB,这样应该能提升顺序读的吞吐率。每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer:

    1,Index Data:一个轻量级的index,默认是每隔1W行做一个索引。这里做的索引应该只是记录某行的各字段在Row Data中的offset,据说还包括每个Column的max和min值,具体没细看代码。


    2,Row Data:存的是具体的数据,和RCfile一样,先取部分行,然后对这些行按列进行存储。与RCfile不同的地方在于每个列进行了编码,分成多个Stream来存储,具体如何编码在下一篇解析里会讲。


    3,Stripe Footer:存的是各个Stream的类型,长度等信息。


    每个文件有一个File Footer,这里面存的是每个Stripe的行数,每个Column的数据类型信息等;每个文件的尾部是一个PostScript,这里面记录了整个文件的压缩类型以及FileFooter的长度信息等。在读取文件时,会seek到文件尾部读PostScript,从里面解析到File Footer长度,再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读。



create table if not exists user_info_orc(id bigint,username string,password string,sex string) row format delimited fields terminated by '\t' stored as orc;
insert overwrite table user_info_orc select * from user_info_t;



性能对比分析

四种格式类型的文件大小如图




四种格式类型的查询结果


时间:个人感觉差不了多少,可能是数据太少的原因把。这里的数据还是orc时间最短,如果数据很大的时候可能更加能显示效果


文件大小:orc活活的吧一个13M的文件压缩到188k,这里可以看出seqfile的文件最大了



总结:

textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高


sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 需要通过text文件转化来加载


rcfile 存储空间小,查询的效率高 ,需要通过text文件转化来加载,加载的速度最低


orc 存储空间最小,查询的最高 ,需要通过text文件转化来加载,加载的速度最低(个人建议使用orc)


在实际操作过程中另外3种都需要通过textfile临时存储导入数据