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,12View 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.dataView 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.dataView Code