【Juicy-Bigdata】Hive之存储与压缩

HIVE存储格式

Hive支持:TextFile、SequenceFile、ORC、PARQUET

行式存储与列式存储

image-20221120211621092

行存储的特点:行存储查询一行数据的时候效率更好

列存储:可以针对性的设计更好的压缩算法,查询某些字段的效率更高,减少读取

TEXTFILE

默认格式,数据不压缩,HIVE不会对数据进行切分,从而不能进行合并炒作

ORC格式

Optimized Row Columnar

image-20221120212120745

一个ORC文件由若干个Stripe组成,Stripe相当于RowGroup,由三部分组成;

IndexData:记录各个字段在row data的offset

Row Data:部分行具体数据,按列进行存储

Stripe footer:元数据信息

File Footer:存储每个Stripe的行数、每个column的数据类型。

PosterScript:记录文件的压缩类型,fileFooter的长度。

在读取ORC文件的时候,会先读posterscript->FileFooter->stripte,因为文件长度从最后开始约定。

PARQUET

image-20221120212719003

文件是二进制存储的

定义指定存储格式的表

stored as

1
2
3
4
5
6
7
8
9
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 ;

HIVE的压缩格式

image-20221120212946069

在mapper输出与reducer输出阶段进行压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

set hive.exec.compress.intermediate=true;
set mapreduce.map.output.compress=true;

set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

--reduce
set hive.exec.compress.output=true;
--最终输出
set mapreduce.output.fileoutputformat.compress=true;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
-- 设置为块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;


创建一个snappy压缩的orc存储方式的表

1
2
3
4
5
6
7
8
9
10
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 ("o
rc.compress"="SNAPPY");

主流存储文件对比

压缩比比较:

ORC > Parquet > textFile

查询效率:

ORC > TextFile > Parquet