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_tcreate 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左右的数据)
1u1p1男
2u2p2男
3u3p3男
4u4p4男
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临时存储导入数据