准确的来说,Hive是一个将Hive SQL的解释、编译成Hadoop MapReduce任务的工具。数据存储在Hdfs上,默认支持三种文件格式:TEXTFILE、SEQUENCEFILE、RCFILE(允许自定义格式)。
其中TEXTFILE和SEQUENCEFILE都是基于行存储的,RCFILE基于行列混合存储(按行把数据分成多个row group,在row group中对每个列分别进行存储)。
基于HDFS的行存储,同一条记录的所有域都在同一个集群节点,所以具备快速数据加载和动态负载的高适应能力。但在仅针对少数几列进行查询时,不能路过不需要的列,直接定位到所需列,所以不太满足快速的响应查询。
同时由于数据表中包含不同类型,行存储不易获得一个较高的压缩比。RCFILE是基于SEQUENCEFILE实现的列存储格式,既满足了快速数据加载和动态负载高适应需求,也解决了SEQUENCEFILE的一些瓶颈。
其中TEXTFILE和SEQUENCEFILE都是基于行存储的,RCFILE基于行列混合存储(按行把数据分成多个row group,在row group中对每个列分别进行存储)。
基于HDFS的行存储,同一条记录的所有域都在同一个集群节点,所以具备快速数据加载和动态负载的高适应能力。但在仅针对少数几列进行查询时,不能路过不需要的列,直接定位到所需列,所以不太满足快速的响应查询。
同时由于数据表中包含不同类型,行存储不易获得一个较高的压缩比。RCFILE是基于SEQUENCEFILE实现的列存储格式,既满足了快速数据加载和动态负载高适应需求,也解决了SEQUENCEFILE的一些瓶颈。
TEXTFILE
Hive默认的数据格式,数据不做压缩,磁盘开销大,数据解析开销大。
可使用Gzip、Bzip2等压缩算法压缩,压缩后无法对数据进行切分。
反序列开销大,需要对逐个字符判断是不是分隔符和行结束符。
Hive默认的数据格式,数据不做压缩,磁盘开销大,数据解析开销大。
可使用Gzip、Bzip2等压缩算法压缩,压缩后无法对数据进行切分。
反序列开销大,需要对逐个字符判断是不是分隔符和行结束符。
--创建数据表:
drop table if exists textfile_table;
create table if not exists textfile_table(
a string,
b string,
c bigint,
c string) comment '表描述信息'
row format delimited fields terminated by '\001' stored as textfile;
--插入数据:
set hive.exec.compress.output=true; --启用压缩格式
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --指定输出的压缩格式为Gzip
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
insert overwrite table textfile_table select * from T_Name;
SEQUENCEFILE
Hadoop API提供的一种二进制文件,以<Key,Value>的形式序列化到文件中。
这种二进制文件内部使用Hadoop的标准的Writable接口实现序列化和反序列化。它和Hadoop API中的MapFile是互相兼容的。
支持Record和Block压缩,其中Block压缩率更高。
Hadoop API提供的一种二进制文件,以<Key,Value>的形式序列化到文件中。
这种二进制文件内部使用Hadoop的标准的Writable接口实现序列化和反序列化。它和Hadoop API中的MapFile是互相兼容的。
支持Record和Block压缩,其中Block压缩率更高。
--创建数据表:
drop table if exists seqfile_table;
create table if not exists seqfile_table(
a string,
b string,
c bigint,
c string) comment '表描述信息'
row format delimited fields terminated by '\001' stored as sequencefile;
--插入数据操作:
set hive.exec.compress.output=true; --启用输出压缩格式
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --指定输出压缩格式为Gzip
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
SET mapred.output.compression.type=BLOCK; --指定为Block
insert overwrite table seqfile_table select * from T_Name;
RCFILE
数据先按列划分,再垂直划分。结合了行存储和列存储的优点:
RCFILE保证同一行的数据位于同一节点,因此元组重构的开销低。
能够利用列维度的数据压缩,并且能路过不必要的列读取。
改良版本:ORCFILE,效率更高。
--创建数据表:
drop table if exists rcfile_table;
create table if not exists rcfile_table(
a string,
b string,
c bigint,
c string) comment '表描述信息'
row format delimited fields terminated by '\001' stored as rcfile;
--插入数据操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
insert overwrite table rcfile_table select * from T_Name;
三种数据格式比较
1、TextFile 默认格式,加载速度最快,可以采用Gzip、bzip2等进行压缩,压缩后的文件无法split,即并行处理
2、SequenceFile 压缩率最低,查询速度一般,三种压缩格式NONE,RECORD,BLOCK
3、RCfile 压缩率最高,查询速度最快,数据加载最慢。
参考:
http://blog.csdn.net/czw698/article/details/8107888
http://www.cnblogs.com/skyl/p/4740301.html
http://blog.csdn.net/czw698/article/details/8107888
http://www.cnblogs.com/skyl/p/4740301.html