2021年大数据Hive(十):Hive的数据存储格式

2021-10-11 15:38:51 浏览数 (1)

Hive的数据存储格式

Hive支持的存储数的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列式存储)。

一、列式存储和行式存储

行存储的特点: 查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。

列存储的特点: 因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。

相比于行式存储,列式存储在分析场景下有着许多优良的特性:

1)分析场景中往往需要读大量行但是少数几个列。在行存模式下,数据按行连续存储,所有列的数据都存储在一个block中,不参与计算的列在IO时也要全部读出,读取操作被严重放大。而列存模式下,只需要读取参与计算的列即可,极大的减低了IO开销,加速了查询。

2)同一列中的数据属于同一类型,压缩效果显著。列存储往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本。

3)更高的压缩比意味着更小的数据空间,从磁盘中读取相应数据耗时更短。

4)自由的压缩算法选择。不同列的数据具有不同的数据类型,适用的压缩算法也就不尽相同。可以针对不同列类型,选择最合适的压缩算法。

TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;

ORC和PARQUET是基于列式存储的。

​​​​​​​二、主流文件存储格式对比实验

从存储文件的压缩比和查询速度两个角度对比。

存储文件的压缩比测试:

1、TextFile

1)创建表,存储数据格式为TEXTFILE

代码语言:javascript复制
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)向表中加载数据

代码语言:javascript复制
load data local inpath '/export/data/hivedatas/log.data' into table log_text ;

3)查看表中数据大小

代码语言:javascript复制
hadoop fs  -du -h /user/hive/warehouse/myhive.db/log_text;    

18.1 M  /user/hive/warehouse/log_text/log.data

2、ORC

1)创建表,存储数据格式为OR

代码语言:javascript复制
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 ;

2)向表中加载数据

代码语言:javascript复制
insert into table log_orc select * from log_text ;

3)查看表中数据大小

代码语言:javascript复制
hadoop fs  -du -h /user/hive/warehouse/myhive.db/log_orc;

2.8 M  /user/hive/warehouse/log_orc/123456_0

3、Parquet

1)创建表,存储数据格式为parquet

代码语言:javascript复制
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 ;

2)向表中加载数据

代码语言:javascript复制
insert into table log_parquet select * from log_text ;

3)查看表中数据大小

代码语言:javascript复制
hdoop fs  -du -h /user/hive/warehouse/myhive.db/log_parquet;

13.1 M  /user/hive/warehouse/log_parquet/123456_0

存储文件的压缩比总结:

ORC >  Parquet > textFile

存储文件的查询速度测试:

代码语言:javascript复制
1)TextFile

hive (default)> select count(*) from log_text;

_c0

100000

Time taken: 21.54 seconds, Fetched: 1 row(s)

2)ORC

hive (default)> select count(*) from log_orc;

_c0

100000

Time taken: 20.867 seconds, Fetched: 1 row(s)

3)Parquet

hive (default)> select count(*) from log_parquet;

_c0

100000

Time taken: 22.922 seconds, Fetched: 1 row(s)

存储文件的查询速度总结:

ORC > TextFile > Parquet

​​​​​​​三、存储和压缩结合

ORC存储方式的压缩:

Key

Default

Notes

orc.compress

ZLIB

high level compression (one of NONE, ZLIB, SNAPPY)

orc.compress.size

262,144

number of bytes in each compression chunk

orc.stripe.size

67,108,864

number of bytes in each stripe

orc.row.index.stride

10,000

number of rows between index entries (must be >= 1000)

orc.create.index

true

whether to create row indexes

orc.bloom.filter.columns

""

comma separated list of column names for which bloom filter should be created

orc.bloom.filter.fpp

0.05

false positive probability for bloom filter (must >0.0 and <1.0)

1、创建一个非压缩的的ORC存储方式

1)建表语句

代码语言:javascript复制
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");

2)插入数据

代码语言:javascript复制
insert into table log_orc_none select * from log_text ;

3)查看插入后数据

代码语言:javascript复制
hadoop fs -du -h /user/hive/warehouse/myhive.db/log_orc_none;

7.7 M  /user/hive/warehouse/log_orc_none/123456_0

2、创建一个SNAPPY压缩的ORC存储方式

1)建表语句

代码语言:javascript复制
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");

2)插入数据

代码语言:javascript复制
insert into table log_orc_snappy select * from log_text ;

3)查看插入后数据

代码语言:javascript复制
hadoop fs  -du -h /user/hive/warehouse/myhive.db/log_orc_snappy ;

3.8 M  /user/hive/warehouse/log_orc_snappy/123456_0

3、上一节中默认创建的ORC存储方式,导入数据后的大小为

2.8 M  /user/hive/warehouse/log_orc/123456_0

比Snappy压缩的还小。原因是orc存储文件默认采用ZLIB压缩。比snappy压缩的小。

4、存储方式和压缩总结:

在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy