其他分享
首页 > 其他分享> > 第九章 压缩和存储 【文件存储类型、压缩方式的选择】

第九章 压缩和存储 【文件存储类型、压缩方式的选择】

作者:互联网

 1. 结论

  存储格式一般选择 : orc 和 parquet

  压缩方式一般选择 : snappy(不可切片)、lzo(可切片)

  注意: 当读取单个大文件时,要选择lzo方式

 

 2. hive 支持的文件存储格式

    行式存储 : textfile、sequencefile

    列式存储 : orc、parquet

 

 3. 行式存储、列式存储 说明

-- 数据表
channel credit_date   score
huawei  2021-08-01      5
huawei  2021-08-01      5
huawei  2021-08-03      12
huawei  2021-08-04      25
huawei  2021-08-02      1
huawei  2021-08-07      7
huawei  2021-08-08      10
huawei  2021-08-06      33
vivo    2021-09-01      1
vivo    2021-09-02      2
vivo    2021-09-04      5
vivo    2021-09-09      9
vivo    2021-09-07      77
vivo    2021-09-08      10
vivo    2021-09-11      3

-- 行式存储
huawei,2021-08-01,5,huawei,2021-08-01,5...vivo,2021-09-01,1

-- 列式存储
huawei,huawei,huawei,vivo,vivo,2021-08-01,2021-08-01,...5,5,12
View Code

 

 4. 行式存储、列式存储 原理

https://blog.csdn.net/m0_37657725/article/details/98354168?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=2

5. 行式存储 优缺点
    优点:
1. 快速加载数据
2. 快速定位数据
根据 某个字段查找某行数据时
只需要定位字段的位置,其与字段的位置都在目标字段的相邻位置
列式存储则需要每个位置去聚合所有字段
缺点:
1. 无法快速查询数据,特别是只查询表中的少数列时
2. 压缩不充分,一行数据中,字段数据类型不一致,压缩时无法统一压缩算法

6. 列式存储 优缺点
优点:
1. 减少数据读取量(只读取需要的列)
2. 压缩比更高(同列数据类型 必相同)
缺点:
1.查询多个字段时,无法快速定位到记录,需要跨block扫描数据(无法保证同一行数据存储在同一个block上)

7. 测试textfile、orc、Parquet 对比磁盘开销(不使用压缩)
1. textfile 示例
-- 建表
create table home.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;
-- load 数据
load data local inpath '/root/log.data' into table home.log_text ;
-- 查看文件大小(HDFS)
dfs -du -h /user/hive/warehouse/home.db/log_text;
18.1 M  54.4 M  /user/hive/warehouse/home.db/log_text/log.data
-- 源文件大小
[root@gaocun ~]# du -h log.data
18.1    log.data
-- 说明
只是将文件拷贝到hdfs,并未压缩


2.orc 示例
-- 建表
create table home.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
tblproperties("orc.compress"="NONE"); -- 设置 orc 存储不使用压缩
;
-- insert 数据到 log_orc
insert into table home.log_orc  select * from home.log_text ;
-- 查看文件大小(HDFS)
dfs -du -h /user/hive/warehouse/home.db/log_orc;
7.7 M  23.1 M  /user/hive/warehouse/home.db/log_orc/000000_0
-- 源文件大小
[root@gaocun ~]# du -h log.data
18.1    log.data



3.parquet 示例
-- 建表
create table home.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
;
-- insert 数据到 log_parquet
insert into table home.log_parquet  select * from home.log_text ;
-- 查看文件大小(HDFS)
dfs -du -h /user/hive/warehouse/home.db/log_parquet;
13.1 M  39.3 M  /user/hive/warehouse/home.db/log_parquet/000000_0
-- 源文件大小
[root@gaocun ~]# du -h log.data
18.1    log.data
View Code
8. 测试textfile、orc、Parquet 对比压缩算法
-- 测试textfile、orc、Parquet 对比压缩算法
结论:
    源文件 log.data 18.1M
    orc-none : 7.7 M
    orc-zlib : 2.8 M
    orc-snappy : 3.7 M
    parquet-zlib : (不支持)
    parquet-snappy : 6.4 M
压缩比 : zlib > snappy

说明 : 项目中 hive表中数据存储格式一般选择为: orc 和 parquet
            压缩方式 : snappy、lzo

orc 支持压缩方式 : None、Zlib(默认使用)、Snappy
parquet 支持压缩方式 : Uncompress(默认使用,不压缩)、Snappy、Gzip、Lzo
当读取单个大文件时,要使用 Lzo方式(文件可切分)








1.orc-zlib 示例
-- 建表
create table home.log_orc_zlib (
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"="zlib"); -- 设置 orc 存储使用zlib压缩
;
-- insert 数据到 log_orc_zlib
insert into table home.log_orc_zlib  select * from home.log_text ;
-- orc 使用压缩
dfs -du -h /user/hive/warehouse/home.db/log_orc_zlib;
2.8 M  8.3 M  /user/hive/warehouse/home.db/log_orc_zlib/000000_0
-- orc 不使用压缩
dfs -du -h /user/hive/warehouse/home.db/log_orc;
7.7 M  23.1 M  /user/hive/warehouse/home.db/log_orc/000000_0
-- 源文件大小
[root@gaocun ~]# du -h log.data
18.1    log.data

2.orc-snappy 示例
-- 建表
create table home.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"); -- 设置 orc 存储使用 snappy 压缩
;
-- insert 数据到 log_orc_snappy
insert into table home.log_orc_snappy  select * from home.log_text ;
-- orc 使用压缩
dfs -du -h /user/hive/warehouse/home.db/log_orc_snappy;
3.7 M  11.2 M  /user/hive/warehouse/home.db/log_orc_snappy/000000_0
-- orc 不使用压缩
dfs -du -h /user/hive/warehouse/home.db/log_orc;
7.7 M  23.1 M  /user/hive/warehouse/home.db/log_orc/000000_0
-- 源文件大小
[root@gaocun ~]# du -h log.data
18.1    log.data

ZLIB 比 Snappy 压缩的还小。原因是 ZLIB 采用的是 deflate 压缩算法。比 snappy 压缩的 压缩率高




3.parquet-snappy 示例
-- 建表
create table home.log_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
tblproperties("parquet.compression"="snappy"); -- 设置 orc 存储使用 snappy 压缩
;
-- insert 数据到 log_orc_snappy
insert into table home.log_parquet_snappy  select * from home.log_text ;
-- parquet 使用压缩
dfs -du -h /user/hive/warehouse/home.db/log_parquet_snappy;
6.4 M  19.2 M  /user/hive/warehouse/home.db/log_parquet_snappy/000000_0
-- parquet 不使用压缩
dfs -du -h /user/hive/warehouse/home.db/log_orc;
7.7 M  23.1 M  /user/hive/warehouse/home.db/log_orc/000000_0
-- 源文件大小
[root@gaocun ~]# du -h log.data
18.1    log.data
View Code

 

 







标签:存储,string,第九章,压缩,--,user,home,orc,log
来源: https://www.cnblogs.com/bajiaotai/p/15872278.html