综述:

HIve的文件存储格式有四种:TEXTFILE SEQUENCEFILEORC、PARQUET,前面两种是行式存储,后面两种是列式存储;所谓的存储格式就是在Hive建表的时候指定的将表中的数据按照什么样子的存储方式,如果指定了A方式,那么在向表中插入数据的时候,将会使用该方式向HDFS中添加相应的数据类型,关于行列存优劣势可以查看设计数据密集型应用(一)

ORC 是Rcfile的优化版,即Optimize Rcfile,Rcfile基于Lazy Decompression

如果为textfile的文件格式,直接load就OK,不需要走MapReduce;如果是其他的类型就需要走MapReduce了,因为其他的类型都涉及到了文件的压缩,这需要借助MapReduce的压缩方式来实现

总结:

 比对三种主流的文件存储格式TEXTFILE ORCPARQUET

压缩比:ORC >  Parquet >  textFile(textfile没有进行压缩)

查询速度:三者几乎一致

案例证明:

1,textfile,创建表,存储数据格式为TEXTFILE
create table log_text (
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as textfile ;

向表中加载数据

load data local inpath '/opt/module/datas/log.data' into table log_text ;
查看表中数据大小

这个过程不会走MapReduce,而是直接将文件上传到了HDFS,在HDFS上文件的名字还叫log.data
dfs -du -h /user/hive/warehouse/db_hive.db/log_text;
18.1 M  /user/hive/warehouse/db_hive.db/log_text/log.data

2,ORC,创建表,存储数据格式为ORC
create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc ;

向表中加载数据
insert into table log_orc select * from log_text ;

查看表中数据大小
这个过程要走MapReduce,而且文件是按照列式存储的,还会对文件进行压缩,Orc默认使用的压缩方式是
zlib因此会更加节省空间,hadfs上是新的文件名,

hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc;
2.8 M  /user/hive/warehouse/db_hive.db/log_orc/000000_0


3,Parquet,创建表,存储数据格式为parquet
create table log_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as parquet ; 

向表中加载数据
insert into table log_parquet select * from log_text ;

查看表中数据大小这个过程要走MapReduce,而且文件是按照列式存储的,因此会更加节省空间,
hadfs上是新的文件名,
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_parquet;
13.1 M  /user/hive/warehouse/db_hive.db/log_parquet/000000_0

存储文件的压缩比总结:
ORC >  Parquet >  textFile


select count(*) from log_text;

select count(*) from log_orc;

select count(*) from log_parquet;

存储文件的查询速度总结:查询速度相近。

压缩和存储的结合:

在建表的时候,如果我们指定了列式存储的方式,他会默认使用对于的压缩方式将我们的数据进行压缩,与此同时我们能够自己定制在文件存储的时候使用什么样子的压缩方式,例子如下:

1.创建一个非压缩的的ORC存储方式
create table log_orc_none(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc tblproperties ("orc.compress"="NONE");
插入数据
hive (default)> insert into table log_orc_none select * from log_text ;
 
2.创建一个SNAPPY压缩的ORC存储方式
create table log_orc_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc tblproperties ("orc.compress"="SNAPPY");
插入数据
hive (default)> insert into table log_orc_snappy select * from log_text ;

3.创建一个默认压缩的ORC存储方式
create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc ;

向表中加载数据
insert into table log_orc select * from log_text ;

对比三者的压缩比:

hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_none;
18.1 M  /user/hive/warehouse/db_hive.db/log_orc_none/log.data

hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_snappy;
3.8 M  /user/hive/warehouse/db_hive.db/log_orc_snappy/000000_0

hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc;
2.8 M  /user/hive/warehouse/db_hive.db/log_orc/000000_0

总结:
没有压缩的orc格式相当于textfile,默认的压缩格式压缩比最大,snappy对数据进行了压缩
orc存储文件默认采用ZLIB压缩,ZLIB采用的是deflate压缩算法。因此比snappy压缩的小。
文件没有压缩的话,HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名

总结:

比对三种主流的文件存储格式TEXTFILE ORCPARQUET

压缩比:ORC(ZLIB压缩) >  Parquet (Uncompress即默认不压缩)>  textFile(textfile不压缩)

查询速度:三者几乎一致

HDFS上显示的是原来的文件名,如果压缩的话,使用类似于000000_0的文件名

更多高质文章欢迎大家关注博主的公众号:stackoverflow

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐