ORC与Parquet表的压缩

2021-01-06 11:14:26 浏览数 (1)

Hive表压缩功能

除了直接配置MapReduce压缩功能外,Hive的ORC表和Parquet表直接支持表的压缩属性。

但支持的压缩格式有限,ORC表支持None、Zlib、Snappy压缩,默认为ZLIB压缩。但这3种压缩格式不支持切分,所以适合单个文件不是特别大的场景。使用Zlib压缩率高,但效率差一些;使用Snappy效率高,但压缩率低。

Parquet表支持Uncompress、Snappy、Gzip、Lzo压缩,默认不压缩Uncompressed。其中Lzo压缩是支持切分的,所以在表的单个文件较大的场景会选择Lzo格式。Gzip方式压缩率高,效率低;而Snappy、Lzo效率高,压缩率低。

ORC表压缩

ORC表的压缩,需要通过表属性orc.compress来指定。orc.compress的值可以为NONE、ZLIB、SNAPPY,默认为ZLIB。

首先创建一个非压缩的ORC表:

代码语言:javascript复制
create table compress_orc_none
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS orc
tblproperties ("orc.compress"="NONE")
as select * from compress_2;

然后再创建一个使用SNAPPY压缩的ORC表:

代码语言:javascript复制
create table compress_orc_snappy
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS orc
tblproperties ("orc.compress"="SNAPPY")
as select * from compress_2;

这里文件大小没有减少,反而增加了,这是因为数据量较少,进行Snappy压缩时,反而增加了压缩头和尾的额外数据。数据量较大时,就会有明显的效果。

最后,使用默认压缩格式ZLIB的ORC表,进行对比:

代码语言:javascript复制
create table compress_orc_zlib
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS orc
as select * from compress_2;

Zlib格式虽然压缩效率低,但压缩率很高,可以看到相对于None、Snappy格式,文件大小都有很明显的减少。

Parquet表压缩

Parquet表的压缩,通过表属性parquet.compression指定。值可以是Uncompressed、Snappy、Gzip、Lzo。默认是不进行压缩的Uncompressed。

首先创建一张普通Parquet表,默认为Uncompressed压缩格式:

代码语言:javascript复制
create table compress_parquet_none
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS parquet
as select * from compress_2;

然后创建压缩率较低,但效率较高的Snappy格式的Parquet表:

代码语言:javascript复制
create table compress_parquet_snappy
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS parquet
tblproperties ("orc.compress"="SNAPPY")
as select * from compress_2;

数据量较小,大小没有发生变化。最后创建压缩率较高,但效率较低的Gzip格式的Parquet表:

代码语言:javascript复制
create table compress_parquet_gzip
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS parquet
tblproperties ("orc.compress"="GZIP")
as select * from compress_2;

在小数据量情况下,大小依然没有发生变化。虽然小数据量的参考意义不大,但基本能看出来,Parquet各压缩方式之间还是比较稳定的,而且整体要比ORC的压缩率要低。

全局压缩配置

除了在建表时手动指定ORC、Parquet表的压缩格式的属性之外,也可以在执行建表语句前,使用set命令进行指定。

代码语言:javascript复制
--设置parquet表的压缩格式为SNAPPY
set parquet.compression=SNAPPY;
--设置orc表的压缩格式为SNAPPY
set orc.compress=SNAPPY

当然,这意味着,在生产环境中,可以将参数直接全局配置到hive-site.xml文件中,来规定表的压缩格式。

代码语言:javascript复制
  <property>
    <name>parquet.compression</name>
    <value>SNAPPY</value>
  </property>

0 人点赞