每种存储格式都有自己的用处,这里从存储文件的压缩比和查询速度两个方面对比
存储文件压缩比测试
测试数据为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。