转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88391024
通过explain命令可以查看某个查询语句是否用到了索引。
创建索引
比如,有数据表:
create table employees(
name string,
salary float,
subordinates array,
deductions map,
address struct
)
partitioned by (country string, state:string);
对分区字段country建立索引:
create index employees_index
on table employees (country)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild
idxproperties('creator' = 'me', 'create_at' = 'some_time')
in table employees_index_table
partitioned by (country, name)
comment 'Employees indexed by country and name.';
如果我们完全省略掉partitioned by语句的话,那么索引将会包含原始表的所有分区。
as...语句指定了索引处理器,也就是一个实现了索引接口的Java类。
并非一定要求索引处理器在一种新表中保留索引数据,但是如果需要的话,会使用到in table...语句。这个句式提供了和创建其他类型表一样的很多功能。也可以在comment语句前增加row format、 stored as、 stored by、location等语句。
目前,除了S3中的数据,对外部表和视图都是可以建立索引的。
Bitmap索引
Hive v0.8.0版本中新增了一个内置的bitmap索引处理器,bitmap索引普遍应用于排重后值较少的列。下面是对前面的例子使用bitmap索引处理器重写后的语句:
create index employees_index
on table employees(country)
as 'BITMAP'
with deferred rebuild
idxproperties('creator' = 'me', 'created_at'='some_time')
in table employees_index_table
partitioned by (country, name)
comment 'Employees indexed by country and name.';
重建索引
如果指定了deferred rebuild,那么,新索引将呈现空白状态。在任何时候,都可以进行第一次索引创建或者使用alter index对索引进行重建:
alter index employees_index
on table employees
partition (country = 'US')
rebuild;
如果省略掉partition,那么将会对所有分区进行重建索引。
如果重建索引失败,那么在重建开始之前,索引将停留在之前的版本状态。
显示索引
show formatted index on employees;
关键字formatted是可选的,增加这个关键字可以使输出中包含有列的名称。用户还可以替换index为indexes,这样输出中就可以列举出多个索引信息了。
删除索引
如果有索引表的话,删除一个索引将会删除这个索引表:
drop index if exists employees_index on table employees;
Hive不允许用户直接使用drop index语句之前删除索引表。
如果被索引的表被删除了,那么其对应的索引和索引表也会被删除。同样的,如果原始表的某个分区被删除了,那么这个分区对应的分区索引也同时会被删除掉。