当前位置:   article > 正文

Hive索引_with deferred rebuild

with deferred rebuild

Hive索引

Compact索引

CREATE INDEX idx_xxx ON TABLE xxx(tablename) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH DEFERRED REBUILD;
  • 1

使用 show tables; 命令查看,发现现在多了一个叫 default__xxx_idx_xxx__ 的表,但是里面没有内容,因为CREATE INDEX 命令后面加了 WITH DEFERRED REBUILD 选项,所以索引不会自动创建,而是要执行:ALTER INDEX idx_xxx ON xxx REBUILD; 才会重建索引。

如果有分区的话,可以针对单独的分区重建索引: ALTER INDEX idx_xxx ON xxx PARTITION(month='2019-09') REBUILD;

HiveHive索引有很大的局限,其中之一就是占用空间。根据之前有位大佬(不是我)的测试:xxx表其中一个108G的分区,索引需要32G的左右空间(大佬说是在没有压缩的情况下,他还未验证索引是否可以压缩)。

REBUILD 索引后,会发现索引的分区结构和原表一致,对于Compact索引,其实就是索引字段名,文件,偏移值这三个字段组成的表。

可以用 select * from default__xxx_idx_xxx__; 查看。或用describe idx_xxx 会发现他有3个字段:

name  			string
_bucketname  	string
_offsets		array<bigint>
  • 1
  • 2
  • 3

其中:

name :是原xxx表种的字段
_bucketname :是xxx表在HDFS中的文件名。
_offsets :是该name在_bucketname 文件中的便宜地址,是一个数组。

例如:name=‘zhangsan’ 的字段在xxx表中出现了3次,那么 _offsets 就可能会有3个值(之所以为可能,因为存在3个文件中个出现一次的情况),分别是 3次 ‘zhangsan’ 在文件中的偏移量。

索引第二个缺点就是使用方法并不统一。例如我对name建立索引后,需要查询 select count(*) from xxx where name = 'zhangsan' 时,要写成:

select size(`_offsets`) from default__xxx_idx_xxx__ where name = 'zhangsan';
  • 1

注意 _offsets 前后有反引号 `。

因为正常情况下,Hive字段名不允许以 _ 开头, _bucketname 和 _offsets 是隐藏字段&

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/720587
推荐阅读
相关标签
  

闽ICP备14008679号