Hive的存储格式对比

在生产中可以通过Hive表的文件格式及查询速度的对比来确定使用哪种文件格式,以节省空间和提高查询速度;

成都创新互联公司是一家集网站建设,浚县企业网站建设,浚县品牌网站建设,网站定制,浚县网站建设报价,网络营销,网络优化,浚县网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

官方参考文档:https://cwiki.apache.org/confluence/display/HIVE

结论:

    压缩效果:

        最好的是:bzip2;bzip2压缩比很高,但是占用时间较久

        其次:orc和parquet的压缩几乎一致;生产建议选择orc或者parquet; 

    查询性能:由于数据量太小,得出的结果不准确;大佬的生产经验是parquet的查询性能要优于orc;

Hive支持的存储格式有:

    Text File

    SequenceFile

    RCFile

    Avro Files

    ORC Files

    Parquet

注:Hive默认的格式为Text File,可以通过set hive.default.fileformat查看

> set hive.default.fileformat;
hive.default.fileformat=TextFile

以下将对每种文件格式进行对比:

创建TextFile表

#原始数据格式为TextFile,大小为65M
[hadoop@hadoop001 ~]$ hadoop fs -du -s -h /input/*
64.9 M  194.7 M  /input/part-r-00000

#创建表并加载TextFile数据
CREATE EXTERNAL TABLE textfile (
cdn string, 
region string, 
level string, 
time string, 
ip string, 
domain string, 
url string, 
traffic bigint)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; 

load data local inpath '/home/hadoop/part-r-00000' overwrite into table textfile;

可以看到此数据大小的64.9M

Hive的存储格式对比

从上面的表中创建一个bzip2压缩的表:

hive支持在创建表的时候对数据进行压缩,配置如下:

设置开启压缩:set hive.exec.compress.output=true;

查看压缩的格式:set mapreduce.output.fileoutputformat.compress.codec;

配置压缩的格式:set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec

#创建一个bzip2压缩的表
create table textfile_bzip2 as select * from textfile;

可以看到启动压缩以后,大小只有13.84M,格式为bz2

Hive的存储格式对比

创建SequenceFile表

#创建SequenceFile表
CREATE EXTERNAL TABLE seqfile (
cdn string, 
region string, 
level string, 
time string, 
ip string, 
domain string, 
url string, 
traffic bigint)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as sequencefile;

#加载数据
insert into table seqfile select * from textfile;
注:默认用load加载数据时,由于源文件是textfile,而表格式为sequencefile,所以无法直接加载,要借用一个临时表使用insert into进行加载

可以看到sequencefile格式的表数据比原始文件还要大,这是因为sequencefile表在创建时,增加了很多额外信息,在生产中不使用此种类型的文件格式;

Hive的存储格式对比

创建RCFile表

#创建RCFile表
CREATE EXTERNAL TABLE rcfile (
cdn string, 
region string, 
level string, 
time string, 
ip string, 
domain string, 
url string, 
traffic bigint)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as rcfile;

#加载数据
insert into table rcfile select * from textfile;

rcfile的作用仅仅是将存储空间节省了10%左右,在生产中不使用此种文件格式;

创建ORC Files:orc是基于rc,是优化过后的列式存储

关于orc的官方介绍:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

#创建orc格式的表;默认orcfile是采用zlib格式进行压缩
CREATE EXTERNAL TABLE orcfile (
cdn string, 
region string, 
level string, 
time string, 
ip string, 
domain string, 
url string, 
traffic bigint)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as orcfile;

#加载数据
insert into table orcfile select * from textfile;

#创建orc格式的表,指定不采用zlib压缩;通过"orc.compress"="NONE"指定
create table orcfile_none
stored as orc tblproperties ("orc.compress"="NONE") 
as select * from textfile;

orcfile采用zlib压缩:

Hive的存储格式对比

orcfile不采用zlib压缩:

Hive的存储格式对比

总结:通过对比,采用zlib压缩时,节省的空间更多一点

创建Parquet格式的表

#创建Parquet格式不使用压缩
create table parquetfile
stored as parquet
as select * from textfile;


#创建Parquet格式使用gzip压缩
set parquet.compression=gzip;

create table parquetfile_gzip
stored as parquet
as select * from textfile;

注:通过对比,Parquet格式使用gzip压缩时,可以节省大量的空间

parquet不经过gzip压缩:可以看到几乎没有压缩多少空间

Hive的存储格式对比

parquet经过gzip压缩:可以看到压缩后的数据很代;

Hive的存储格式对比

    

查询性能对比:

查询语句:select count(*) from textfile|rcfile|orcfile|parquetfile where ip='210.35.230.31';

查询条数:

    textfile:查询了全表的所有数据,查询68085397条数据;

    rcfile:查询1973371条数据;

    orcfile:查询2883851条数据;

    parquetfile:查询了8622602条数据;


文章标题:Hive的存储格式对比
文章路径:http://scyanting.com/article/gsghhe.html