Hive 存储与压缩

本文中用到的数据源下载:log.data

存储格式

Hive 支持多种存储格式,常用的有三种:TEXTFILEORCPARQUET。其中 TEXTFILE 为 Hive 的默认存储格式,即:普通文本格式。

行存储与列存储

1. 行存储

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

2.列存储的特点

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

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

ORCPARQUET 是基于列式存储的。

存储格式解析

TextFile 格式

默认格式,数据不做压缩,磁盘开销大,数据解析开销大。

ORC 格式

ORC 是一种列式存储的格式,默认采用 ZLIB 进行压缩。每个 ORC 文件由 1 个或多个 Stripe 组成,每个 Stripe 一般为 HDFS 的块大小,每一个 stripe 包含多条记录,这些记录按照列进行独立存储。每个 Stripe 里有三部分组成,分别是 Index Data,Row Data,Stripe Footer。如下图所示:

解析:

  • index Data:记录当前 Stripe 的索引。

  • Row Data:存储数据。

  • Stripe Footer:记录每个 Stripe 的相关信息,如:长度、大小等等。

  • File Footer:记录每一个列所有 Stripe 的相关信息,如:行数,数据类型信息等等。

  • Postscript:记录 File Footer 的长度信息与整个文件的压缩类型等等。

读取顺序: Postscript ——> File Footer ——> Stripe

Parquet 格式

Parquet 文件是以二进制列式存储的格式,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此 Parquet 格式文件是自解析的。

存储效率对比

TextFile 格式

创建 TextFile 格式表:

create table test_textfile( 
   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 data local inpath '/opt/module/data/log.data' into table test_textfile;

查看存储大小:

进入 HDFS 的 web 界面查看存储大小:

可以看到以 TextFile 存储该数据文件的大小为 18.13 MB

我们也可以使用命令行的方式来查看文件存储大小:

hdfs dfs -du  /user/hive/warehouse/test.db/test_textfile

输出结果如下:

文件的大小   备份数大小(我的备份数是 3)       文件
18.1 M                54.4 M            /user/hive/warehouse/test.db/test_textfile/log.data

ORC 格式(推荐)

创建 ORC 格式表:

create table test_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
-- 设置 orc 存储不使用压缩
tblproperties("orc.compress"="NONE"); 

-- 加载测试数据
insert into table test_orc select * from test_textfile;

花费时间:17.605

查看存储大小:

进入 HDFS 的 web 界面查看存储大小:

可以看到以 ORC 存储该数据文件的大小为 7.69 MB,花费 17.605秒。

Parquet 格式

创建 Parquet 格式表:

create table test_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 into table test_parquet select * from test_textfile;

花费时间:19.403

查看存储大小:

进入 HDFS 的 web 界面查看存储大小:

可以看到以 Parquet 存储该数据文件的大小为 13.09 MB,花费 19.403 秒。

对比

通过同一数据源的存储对比,综合时间效率,最终得出结论: ORC > Parquet > TextFile

压缩

为了控制变量,我们使用与 存储效率对比 中一样的数据源。

ORC —— ZLIB 压缩

在 ORC 中,可以指定三种压缩策略,分别是:ZLIB,NONE,SNAPPY。其中 ZLIB 压缩算法是 ORC 的默认压缩策略,所以创建表时无需指定。

创建使用 ZLIB 进行压缩后的 ORC 格式表:

create table test_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;

-- 加载测试数据
insert into table test_orc_zlib select * from test_textfile;

花费时间:21.348

查看存储大小:

进入 HDFS 的 web 界面查看存储大小:

未进行压缩:

使用 ZLIB 进行压缩:

可以看到以 ORC 存储该数据文件未进行压缩前的大小为 7.69 MB,花费 17.605 秒,而使用 ZLIB 进行压缩后的大小为 2.78 MB,花费 21.348 秒。

ORC —— SNAPPY 压缩

创建使用 SNAPPY 进行压缩后的 ORC 格式表:

create table test_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");

-- 加载测试数据
insert into table test_orc_snappy select * from test_textfile;

花费时间:18.474

查看存储大小:

进入 HDFS 的 web 界面查看存储大小:

未进行压缩:

使用 ZLIB 进行压缩:

使用 SNAPPY 进行压缩:

可以看到以 ORC 存储该数据文件未进行压缩前的大小为 7.69 MB,花费 17.605 秒,而使用 ZLIB 进行压缩后的大小为 2.78 MB,花费 21.348 秒,使用 SNAPPY 进行压缩后的大小为 3.75 MB,花费 18.474 秒。

可以看到 ZLIB 比 SNAPPY 压缩的还小。原因是 ZLIB 采用的是 deflate 压缩算法,比 SNAPPY 压缩的压缩率更高。

Parquet —— GZIP 压缩

Parquet 中的 GZIP 压缩方式同 ORC 中的 ZLIB 压缩方式一致。

创建使用 GZIP 进行压缩后的 Parquet 格式表:

create table test_parquet_gzip( 
   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
-- 指定压缩策略,注意关键词的区别 parquet.compression
tblproperties("parquet.compression"="GZIP");

-- 加载测试数据
insert into table test_parquet_gzip select * from test_textfile;

花费时间: 20.402 秒。

查看存储大小:

进入 HDFS 的 web 界面查看存储大小:

未进行压缩:

使用 GZIP 进行压缩:

可以看到以 Parquet 未进行压缩前存储该数据文件的大小为 13.09 MB,花费 19.403 秒,而使用 GZIP 进行压缩后的大小为 3.86 MB,花费 20.402 秒。

Parquet —— SNAPPY 压缩

创建使用 SNAPPY 进行压缩后的 Parquet 格式表:

create table test_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
-- 指定压缩策略,注意关键词的区别 parquet.compression
tblproperties("parquet.compression"="SNAPPY");

-- 加载测试数据
insert into table test_parquet_snappy select * from test_textfile;

花费时间: 18.414 秒。

查看存储大小:

进入 HDFS 的 web 界面查看存储大小:

未进行压缩:

使用 GZIP 进行压缩:

使用 SNAPPY 进行压缩:

可以看到以 Parquet 格式存储该数据文件未压缩前的大小为 13.09 MB,花费 花费 19.403 秒,而使用 GZIP 进行压缩后的大小为 3.86 MB,花费 20.402 秒,使用 SNAPPY 进行压缩后的大小为 6.39 MB,花费 18.414 秒。

总结

通过对存储效率与压缩效率,综合时间效率,在实际生产过程中,我们一般使用 ORC 或 Parquet 作为 Hive 表的数据存储格式,而压缩方式则推荐使用 SNAPPY 作为压缩策略。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. HIVE结构 6 1.1 HIVE架构 6 1.2 HiveHadoop 关系 7 1.3 Hive 和普通关系数据库的异同 8 1.4 HIVE元数据库 9 1.4.1 DERBY 9 1.4.2 Mysql 10 1.5 HIVE的数据存储 11 1.6 其它HIVE操作 11 2. HIVE 基本操作 12 2.1 create table 12 2.1.1 总述 12 2.1.2 语法 12 2.1.3 基本例子 14 2.1.4 创建分区 15 2.1.5 其它例子 16 2.2 Alter Table 17 2.2.1 Add Partitions 17 2.2.2 Drop Partitions 17 2.2.3 Rename Table 17 2.2.4 Change Column 18 2.2.5 Add/Replace Columns 18 2.3 Create View 18 2.4 Show 19 2.5 Load 19 2.6 Insert 21 2.6.1 Inserting data into Hive Tables from queries 21 2.6.2 Writing data into filesystem from queries 21 2.7 Cli 22 2.7.1 Hive Command line Options 22 2.7.2 Hive interactive Shell Command 24 2.7.3 Hive Resources 24 2.7.4 调用python、shell等语言 25 2.8 DROP 26 2.9 其它 27 2.9.1 Limit 27 2.9.2 Top k 27 2.9.3 REGEX Column Specification 27 3. Hive Select 27 3.1 Group By 28 3.2 Order /Sort By 28 4. Hive Join 29 5. HIVE参数设置 31 6. HIVE UDF 33 6.1 基本函数 33 6.1.1 关系操作符 33 6.1.2 代数操作符 34 6.1.3 逻辑操作符 35 6.1.4 复杂类型操作符 35 6.1.5 内建函数 36 6.1.6 数学函数 36 6.1.7 集合函数 36 6.1.8 类型转换 36 6.1.9 日期函数 36 6.1.10 条件函数 37 6.1.11 字符串函数 37 6.2 UDTF 39 6.2.1 Explode 39 7. HIVE 的MAP/REDUCE 41 7.1 JOIN 41 7.2 GROUP BY 42 7.3 DISTINCT 42 8. 使用HIVE注意点 43 8.1 字符集 43 8.2 压缩 43 8.3 count(distinct) 43 8.4 JOIN 43 8.5 DML操作 44 8.6 HAVING 44 8.7 子查询 44 8.8 Join中处理null值的语义区别 44 9. 优化与技巧 47 9.1 全排序 47 9.1.1 例1 48 9.1.2 例2 51 9.2 怎样做笛卡尔积 54 9.3 怎样写exist/in子句 54 9.4 怎样决定reducer个数 55 9.5 合并MapReduce操作 55 9.6 Bucket 与 sampling 56 9.7 Partition 57 9.8 JOIN 58 9.8.1 JOIN原则 58 9.8.2 Map Join 58 9.8.3 大表Join的数据偏斜 60 9.9 合并小文件 62 9.10 Group By 62 10. HIVE FAQ: 62
Hive中,我们可以使用不同的压缩格式来压缩数据文件以节省存储空间和提高查询性能。以下是一些常见的压缩格式: 1. Gzip:Gzip是一种流行的压缩格式,它可以在保持压缩比例的同时提供相对较快的解压速度。在Hive中,我们可以使用以下命令将数据文件压缩为gzip格式: ``` SET hive.exec.compress.output=true; SET mapred.output.compression.type=BLOCK; SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; ``` 2. Snappy:Snappy是一种快速的、无损的压缩格式,它可以在保持压缩比例的同时提供非常快的解压速度。在Hive中,我们可以使用以下命令将数据文件压缩为snappy格式: ``` SET hive.exec.compress.output=true; SET mapred.output.compression.type=BLOCK; SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; ``` 3. Bzip2:Bzip2是一种高压缩比的压缩格式,它可以在保持极高压缩比例的同时提供很慢的解压速度。在Hive中,我们可以使用以下命令将数据文件压缩为bzip2格式: ``` SET hive.exec.compress.output=true; SET mapred.output.compression.type=BLOCK; SET mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec; ``` 在以上所有命令中,SET hive.exec.compress.output=true; 是必需的,它指示Hive压缩输出。SET mapred.output.compression.type=BLOCK; 指定块压缩类型。SET mapred.output.compression.codec= 指定压缩算法的类名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮给我抄代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值