Hive索引

Hive索引

Compact索引

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 是隐藏字段&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值