前言
前一篇根据官网对Hive表如何使用压缩格式的数据进行了阐述,不过从Hive编程指南中我们可以看到如下一种建议:
当然Hive编程指南的中Hive的版本是非常低的,低于0.13版本,因此创建压缩表的方式和前一篇略有不同,不过我们重点不在这,而是,同时使用入ORC、Parquet这种格式,并且采用Gzip、Snappy压缩,这样的性能究竟如何呢?
创建表
TextFile格式:
CREATE TABLE textFile (id INT,name STRING)
PARTITIONED BY ( date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Parquet格式:
CREATE TABLE parquet(id INT,name STRING)
PARTITIONED BY ( date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS PARQUET;
Parquet+Snappy压缩
CREATE TABLE snappy(id INT,name STRING)
PARTITIONED BY ( date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
STORED AS PARQUET TBLPROPERTIES('parquet.compression'='SNAPPY');
加载数据
给textFile表加载数据:
LOAD DATA LOCAL INPATH '/var/lib/hadoop-hdfs/test.gz' INTO TABLE textFile;
给parquet表加载数据:
SET hive.exec.dynamic.partition.mode=nonstrict
SET hive.exec.compress.output=true;
INSERT OVERWRITE TABLE parquet PARTITION(date) SELECT * FROM textFile;
给parquet+snappy压缩表加载数据:
SET hive.exec.dynamic.partition.mode=nonstrict
SET hive.exec.compress.output=true;
INSERT OVERWRITE TABLE snappy PARTITION(date) SELECT * FROM textFile;
测试压缩比
文件类型 | 大小(G) |
---|---|
TextFile | 477.7 |
Parquet | 347.2 |
Parquet+Snappy | 185.0 |
Parquet是原生的1.4倍,Parquet+Snappy是原生的2.6倍是只用Parquet的1.9倍
查询效率
简单的执行一下
SELECT COUNT(*) FROM table;
结果都是:
1830337392
文件类型 | 耗时(senconds) |
---|---|
TextFile | 156.204 |
Parquet | 247.831 |
Parquet+Snappy | 210.01 |
查询效率TextFile最高,Parquet最低。也就是不经过压缩的数据查询效率会更高,因此一般ods层为了减少存储空间会进行压缩,但dw层可能会为了快速运算,可以考虑不压缩(具体根据实际业务来设计)。
后记
通过简单的测试,发现采用Hive编程指南的方案是最佳实战