您好,登錄后才能下訂單哦!
在生產中可以通過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
從上面的表中創建一個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
創建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表在創建時,增加了很多額外信息,在生產中不使用此種類型的文件格式;
創建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壓縮:
orcfile不采用zlib壓縮:
總結:通過對比,采用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壓縮:可以看到幾乎沒有壓縮多少空間
parquet經過gzip壓縮:可以看到壓縮后的數據很代;
????
查詢性能對比:
查詢語句:select count(*) from textfile|rcfile|orcfile|parquetfile where ip='210.35.230.31';
查詢條數:
????textfile:查詢了全表的所有數據,查詢68085397條數據;
????rcfile:查詢1973371條數據;
????orcfile:查詢2883851條數據;
????parquetfile:查詢了8622602條數據;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。