概述
本文通过使用Hadoop的数据仓库工具Hive中的不同存储格式,比较按行存储和按列存储的不同。按列存储使用的是企业中最长见的ORC和PARQUET。
这里不讲解对于Hive的使用。
Columnar VS Row-based
-
行存储和列存储的存储区别
-
优缺点比较
- 按行存储:
优点:insert和update更加容易
缺点:查询某几列时,所有数据也都会被读取
- 按列存储:
优点:查询时只有涉及到的列会被读取;投影很高效;任何列都能作为索引
缺点:insert/update会比较麻烦
- 按行存储:
-
不同存储格式的压缩比较
企业中更多的业务场景是对列数据进行操作,如果按行存储,需要把每行数据加载到内存中,在从每行去获取数据。
ORC和PARQUET
ORC
Hive使用orc格式时,默认使用ZLIB压缩
Parquet
实验准备
创建数据库
- Hive官网建库示例
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
- 建库
create database if not exists web_analysis location "/user/hive/warehouse/web_analysis";
创建表和加载数据
准备好存放了100000条数据page_views.data数据文件。
- 创建表page_views_txt,格式:行存储,TEXTFILE格式
create table web_analysis.page_views_txt(
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;
- 加载数据
load data local inpath '/opt/datas/page_views.data' into table page_views_txt;
- 获取表page_views_txt条数
select count(1) from page_views_txt;
Hive通过跑MR之后获取到page_views_txt的条数是100000。
- 创建表page_views_orc,格式:orc,按列存储
create table web_analysis.page_views_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;
- 创建表page_views_parquet,格式:parquet,按列存储
create table web_analysis.page_views_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;
- 从已有表插入数据
insert into table page_views_parquet select * from page_views_txt ;
insert into table page_views_orc select * from page_views_txt ;
比较表的大小
- TEXTFILE格式
在hive命令行中输入
dfs -du -h /user/hive/warehouse/web_analysis/page_views_txt;
得到以下结果,说明page_views_txt有18.1M
- PARQUET格式
在hive命令行中输入
dfs -du -h /user/hive/warehouse/web_analysis/page_views_parquet;
得到以下结果,说明page_views_parquet有13.1M
- ORC格式
在hive命令行中输入
dfs -du -h /user/hive/warehouse/web_analysis/page_views_orc;
得到以下结果,说明page_views_orc只有2.6M
存储格式+压缩
ORC
ORC格式默认ZLIB压缩,这里设置为snappy
create table page_views_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");
PARQUET
set parquet.compression=SNAPPY ;
create table page_views_parquet_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 parquet;