在同一个 Hive 表上进行多次压缩

Posted

技术标签:

【中文标题】在同一个 Hive 表上进行多次压缩【英文标题】:Multiple compression on same hive table 【发布时间】:2018-06-11 00:20:24 【问题描述】:

我有一个按年/月分区的 Hive 表,它包含至少 7 年的数据。我想做的是通过 Snappy 压缩最新数据(例如 1 岁之前),但通过 gzip 等更好的压缩技术压缩旧数据。如何在 Hive 中执行此操作?

【问题讨论】:

您确定要使用 gzip 压缩数据吗?这种格式是不可拆分的,因此当您要查询拆分成块的数据时会遇到严重的性能问题。 我的意思是,我只是举了一个例子。我仍然想将几乎不使用的旧数据压缩成压缩比更好的其他格式(即使以性能为代价,因为我很少使用这些数据) 【参考方案1】:

您可以使用不同的压缩设置覆盖不同的分区。 配置压缩编解码器并使用此编解码器插入要压缩的覆盖分区。

对于活泼的人:

set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec; 
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

使用 snappy 编解码器覆盖分区:

--enable dynamic partitions
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

--use where conditions to limit new data only
insert overwrite table table_name partition(partition_key)
select * from table_name where partition_key <your condition here> ;

对于 gzip,使用 GzipCodec:

set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec; 
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec;

使用 gzipcodec 覆盖分区:

--enable dynamic partitions
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

--use where conditions to limit OLD data only
insert overwrite table table_name partition(partition_key)
select * from table_name where partition_key <your condition here> ;

通过这种方式,您可以为不同的分区使用不同的压缩编解码器。并且您在选择这些表时不需要指定编解码器。 Hive 将自动识别应使用哪个编解码器进行解压缩。

当然,这与 ORC 或 parquet 等自包含文件格式无关。它们可以有自己的压缩属性。例如 orc.compress=SNAPPY

【讨论】:

对于任何潜在的查询,Bzip2 将是比 Gzip 更好的选择 @cricket_007 当然,Bzip2 是可拆分的

以上是关于在同一个 Hive 表上进行多次压缩的主要内容,如果未能解决你的问题,请参考以下文章

Hive 多次与自身连接表

是否可以在 NOT-a-type 上进行多次调度?

使用 hive 解析 XML 中的多次出现问题

是否可以在 Hive 中的常量列上进行分组?

如何在 BIRT 报告中多次运行一个表

如何将多次包含相同值的行导入另一个工作表