赞
踩
CREATE INDEX idx_xxx ON TABLE xxx(tablename) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH DEFERRED REBUILD;
使用 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>
其中:
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';
注意 _offsets 前后有反引号 `。
因为正常情况下,Hive字段名不允许以 _ 开头, _bucketname 和 _offsets 是隐藏字段&
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。