每種存儲格式都有自己的用處,這裏從存儲文件的壓縮比和查詢速度兩個方面對比
存儲文件壓縮比測試
測試數據爲18.1M的日誌文件。
- TextFile格式
(1) 創建表,存儲格式爲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 ;
(2) 導入數據
load data local inpath '/opt/module/datas/log.data' into table log_text ;
(3) 查看數據大小
dfs -du -h /user/hive/warehouse/log_text;
顯示的是18.1M - ORC格式
(1) 建表語句
(2) 導入數據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 ;
導入數據不能直接使用load data local ,否則還是一個18M的文件,使用insert 纔會是orc格式。
insert into table log_orc select * from log_text;
(3) 查看數據大小
dfs -du -h /user/hive/warehouse/log_orc;
可以看到是2.6M,相比較textFile小了很多
- Parquet 格式
(1) 建表語句
(2) 導入數據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 ;
導入數據不能直接使用load data local ,否則還是一個18M的文件,使用insert 纔會是orc格式。
insert into table log_parquet select * from log_text;
(3) 查看數據大小
dfs -du -h /user/hive/warehouse/log_orc;
是13.1M,相比較ORC壓縮效率沒有呢麼高
所以存儲文件的壓縮比總結:
ORC > Parquet > textFile
存儲文件的查詢速度測試
執行語句都是爲select count(*) from log_XXX;
每次查詢三次記錄查詢時間
- TextFile
select count(*) from log_text
100000
Time taken: 47.122 seconds, Fetched: 1 row(s)
100000
Time taken: 28.92 seconds, Fetched: 1 row(s)
100000
Time taken: 27.693 seconds, Fetched: 1 row(s)
- ORC
select count(*) from log_orc
100000
Time taken: 25.844 seconds, Fetched: 1 row(s)
100000
Time taken: 28.264 seconds, Fetched: 1 row(s)
100000
Time taken: 27.214 seconds, Fetched: 1 row(s)
- Parquet
select count(*) from log_parquet
100000
Time taken: 35.83 seconds, Fetched: 1 row(s)
100000
Time taken: 26.94 seconds, Fetched: 1 row(s)
100000
Time taken: 27.853 seconds, Fetched: 1 row(s)
結果就是查詢速度是相近的,但是存儲orc佔據優勢,所以orc格式比較流行。
ORC的格式壓縮
其實在ORC格式是自帶有壓縮的(ZLIB壓縮),而且比snappy壓縮的小,所以我們在使用ORC的時候可以使用自帶的格式。
但是在hadoop壓縮格式類型中沒有ZLIB格式,所以一般都是搭配其他壓縮格式。
在創建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");
tblproperties (“orc.compress”=“SNAPPY”); 可以指定壓縮格式,當然也可以取消壓縮 tblproperties (“orc.compress”=“NONE”);
在實際的項目開發當中,hive表的數據存儲格式一般選擇:orc或parquet。壓縮方式一般選擇snappy,lzo。