您好,登錄后才能下訂單哦!
在生產(chǎn)中可以通過(guò)Hive表的文件格式及查詢速度的對(duì)比來(lái)確定使用哪種文件格式,以節(jié)省空間和提高查詢速度;
官方參考文檔:https://cwiki.apache.org/confluence/display/HIVE
結(jié)論:
????壓縮效果:
????????最好的是:bzip2;bzip2壓縮比很高,但是占用時(shí)間較久
????? ? 其次:orc和parquet的壓縮幾乎一致;生產(chǎn)建議選擇orc或者parquet;?
????查詢性能:由于數(shù)據(jù)量太小,得出的結(jié)果不準(zhǔn)確;大佬的生產(chǎn)經(jīng)驗(yàn)是parquet的查詢性能要優(yōu)于orc;
Hive支持的存儲(chǔ)格式有:
? ? Text File
????SequenceFile
????RCFile
????Avro Files
????ORC Files
????Parquet
注:Hive默認(rèn)的格式為Text File,可以通過(guò)set hive.default.fileformat查看
>?set?hive.default.fileformat; hive.default.fileformat=TextFile
以下將對(duì)每種文件格式進(jìn)行對(duì)比:
創(chuàng)建TextFile表
#原始數(shù)據(jù)格式為TextFile,大小為65M [hadoop@hadoop001?~]$?hadoop?fs?-du?-s?-h?/input/* 64.9?M??194.7?M??/input/part-r-00000 #創(chuàng)建表并加載TextFile數(shù)據(jù) 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;
可以看到此數(shù)據(jù)大小的64.9M
從上面的表中創(chuàng)建一個(gè)bzip2壓縮的表:
hive支持在創(chuàng)建表的時(shí)候?qū)?shù)據(jù)進(jìn)行壓縮,配置如下:
設(shè)置開(kāi)啟壓縮:set?hive.exec.compress.output=true;
查看壓縮的格式:set mapreduce.output.fileoutputformat.compress.codec;
配置壓縮的格式:set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec
#創(chuàng)建一個(gè)bzip2壓縮的表 create?table?textfile_bzip2?as?select?*?from?textfile;
可以看到啟動(dòng)壓縮以后,大小只有13.84M,格式為bz2
創(chuàng)建SequenceFile表
#創(chuàng)建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; #加載數(shù)據(jù) insert?into?table?seqfile?select?*?from?textfile; 注:默認(rèn)用load加載數(shù)據(jù)時(shí),由于源文件是textfile,而表格式為sequencefile,所以無(wú)法直接加載,要借用一個(gè)臨時(shí)表使用insert?into進(jìn)行加載
可以看到sequencefile格式的表數(shù)據(jù)比原始文件還要大,這是因?yàn)閟equencefile表在創(chuàng)建時(shí),增加了很多額外信息,在生產(chǎn)中不使用此種類型的文件格式;
創(chuàng)建RCFile表
#創(chuàng)建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; #加載數(shù)據(jù) insert?into?table?rcfile?select?*?from?textfile;
rcfile的作用僅僅是將存儲(chǔ)空間節(jié)省了10%左右,在生產(chǎn)中不使用此種文件格式;
創(chuàng)建ORC Files:orc是基于rc,是優(yōu)化過(guò)后的列式存儲(chǔ)
關(guān)于orc的官方介紹:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC
#創(chuàng)建orc格式的表;默認(rèn)orcfile是采用zlib格式進(jìn)行壓縮 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; #加載數(shù)據(jù) insert?into?table?orcfile?select?*?from?textfile; #創(chuàng)建orc格式的表,指定不采用zlib壓縮;通過(guò)"orc.compress"="NONE"指定 create?table?orcfile_none stored?as?orc?tblproperties?("orc.compress"="NONE")? as?select?*?from?textfile;
orcfile采用zlib壓縮:
orcfile不采用zlib壓縮:
總結(jié):通過(guò)對(duì)比,采用zlib壓縮時(shí),節(jié)省的空間更多一點(diǎn)
創(chuàng)建Parquet格式的表
#創(chuàng)建Parquet格式不使用壓縮 create?table?parquetfile stored?as?parquet as?select?*?from?textfile; #創(chuàng)建Parquet格式使用gzip壓縮 set?parquet.compression=gzip; create?table?parquetfile_gzip stored?as?parquet as?select?*?from?textfile; 注:通過(guò)對(duì)比,Parquet格式使用gzip壓縮時(shí),可以節(jié)省大量的空間
parquet不經(jīng)過(guò)gzip壓縮:可以看到幾乎沒(méi)有壓縮多少空間
parquet經(jīng)過(guò)gzip壓縮:可以看到壓縮后的數(shù)據(jù)很代;
????
查詢性能對(duì)比:
查詢語(yǔ)句:select count(*) from textfile|rcfile|orcfile|parquetfile where ip='210.35.230.31';
查詢條數(shù):
????textfile:查詢了全表的所有數(shù)據(jù),查詢68085397條數(shù)據(jù);
????rcfile:查詢1973371條數(shù)據(jù);
????orcfile:查詢2883851條數(shù)據(jù);
????parquetfile:查詢了8622602條數(shù)據(jù);
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。