1

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

4

1 回答 1

0

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

对于活泼:

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

于 2018-06-11T06:43:42.493 回答