下面通过各种HIVE存储格式与压缩方式的组合,来比较各种组合下的压缩比率。
1.HDFS上的文本文件
把数据以文本的形式写入HIVE管理表对应的HDFS的分区文件中,是普通的行存储,此时HDFS上数据的大小为37.6MB。
2.Parquet列存储
Parquet列存储可将文件的大小减小。把第一节中的HDFS文件以Hive表的形式存储,需执行以下两个步骤:
(1)第一步:创建一张管理表,存储格式为Parquet(即STORED AS Parquet)。
(2)第二步:将第一节中的表中数据导入第一步创建的管理表中,执行“INSERT OVERWRITE TABLE …… SELECT ……”语句。
此时,表目录的存储大小为16.14MB。
3.Parquet格式+snappy压缩
通过创建parquet格式的hive表,并使用snappy压缩算法,可实现文件的压缩,减少数据的存储大小,但会增加数据的加载速度。建表语句如下所示:
set parquet.compression=snappy;
create table if not exists test_db.test_parquet_snappy(
id STRING,
sessionId STRING,
ip STRING
)
PARTITIONED BY(date_str String,hour_str STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS Parquet
建表完成后,把数据“INSERT OVERWRITE”到该表中。
此时,表目录的存储大小为9.2MB。
4.ORC格式+snappy压缩
通过创建orc格式的hive表,并使用snappy压缩算法,可实现文件的进一步压缩。建表语句例如下SQL所示:
create table if not exists test_db.test_orc_snappy(
id STRING,
sessionId STRING,
ip STRING
)
PARTITIONED BY(date_str String,hour_str STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS ORC
TBLPROPERTIES (“orc.compress"="SNAPPY")
建表完成后,把数据“INSERT OVERWRITE”到该表中。
此时,表目录的存储大小为6.54MB。
5.压缩性能
下图是展示了使用不同格式存储TPC-H和TPC-DS数据集中两个表数据的文件大小对比,可以看出Parquet较之于其他的二进制文件存储格式能够更有效的利用存储空间,而新版本的Parquet(2.0版本)使用了更加高效的页存储方式,进一步的提升存储空间。
可以发现,Parquet在存储性能上有巨大优势。