我有一个按年/月分区的Hive表,它包含至少7年的数据。我想要做的是通过Snappy压缩最新的数据(比如1到1岁),但通过更好的压缩技术(如gzip等)来压缩旧数据。如何在Hive中执行此操作?
答案 0 :(得分: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或镶木地板等自包含文件格式。它们可以有自己的压缩属性。例如orc.compress = SNAPPY