1. 文件存储格式
- TextFile
- SequeceFile
- RCFile
- ORCFile
- PARQuet
2. 说明
| 格式 |
导入数据方式 |
| textfile |
将数据文件直接拷贝到hdfs上,不进行处理 |
| SequenceFile, RCFile, ORCFile, PARQuet |
不能直接将数据文件直接拷贝到hdfs上,数据文件要先导入到TextFile格式的表中,然后再从表中用insert导入各个格式的表中;或者复制表结构及数据的方式 |
3. 不同格式的不同
| 格式 |
存储方式 |
效率 |
| textfile |
行存储 |
磁盘开销大,数据解析开销大,hive不会对数据进行切分 |
| sequencefile |
行存储 |
可分割压缩,一般选择block压缩 |
| refile |
数据按行分块,每块按照列存储 |
压缩快,快速列存取,读取全量数据的操作,性能可能比sequencefile没有明显的优势 |
| orcfile |
数据按行分块,每块按照列存储 |
压缩快,快速列存取,效率比refile高 |
| parquet |
数据列式存储 |
相对于orc格式,hadoop生态系统中大部分工程都支持parquet文件 |
4. 一起对比
- 压缩比:
ORC>Parquet>TextFile(没有进行压缩)
- 查询速度:
三者几乎一致
5. 建表/加载数据
-- 创建表,存储数据格式为TEXTFILE
create table log_text[log_orc|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 textfile[orc|parquet];
-- 向表中加载数据
load data local inpath '/opt/module/datas/log.data' into table log_text;
--向表中加载数据
insert into table log_orc select * from log_text;
-- 向表中加载数据
insert into table log_parquet select * from log_text;
6. 压缩和存储结合
-- 建表
-- 创建一个非压缩的ORC存储方式
create table log_orc_none(
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"="NONE");
-- 插入数据
hive (default)> insert into table log_orc_none select * from log_text;
-- 创建一个SNAPPY压缩的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");
-- 插入数据
hive (default)> insert into table log_orc_snappy select * from log_text;
-- 创建一个默认压缩的ORC存储方式
-- 建表
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;
-- 向表中加载数据
insert into table log_orc select * from log_text;
-- 对比三者的压缩比:
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_none;
18.1 M /user/hive/warehouse/db_hive.db/log_orc_none/log.data
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc_snappy;
3.8 M /user/hive/warehouse/db_hive.db/log_orc_snappy/000000_0
hive (db_hive)> dfs -du -h /user/hive/warehouse/db_hive.db/log_orc;
2.8 M /user/hive/warehouse/db_hive.db/log_orc/000000_0
没有压缩的orc格式相当于textfile,
默认的压缩格式压缩比例最大,orc存储文件默认采用ZLIB压缩,ZLIB采用的时deflate压缩算法。
文件没有压缩的话,HDFS上显示的是原来的文件名,如果压缩的话,使用类似000000_0的文件名。