在同一个 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 表上进行多次压缩的主要内容,如果未能解决你的问题,请参考以下文章