《Hive权威指南》第八章:HiveQL索引

8 HiveQL:索引

Hive只有有限索引的功能。Hive中没有普通关系型数据库中键的概念,但是还是可以对一些字段建立索引来加速某些操作的。一张表的索引数据存储在另外一张表中。

当逻辑分区实际上太多太细而几乎无法使用时,建立索引也就成为分区的另一个选择。建立索引可以帮助裁剪掉一张表的一些数据块,这样能够减少MapReduce的输入数据量。并非所有的查询都可以通过建立索引获得好处。通过EXPLAIN命令可以查看某个查询语句是否用到了索引。

这里是否就感觉到索引和分区是否有相似之处,都是通过裁剪数据块来加快查询性能

Hive中的索引和关系型数据库中一样,需要仔细评估才能够使用。维护索引需要额外的存储空间,同时创建索引也需要消耗计算机资源。用户要自己做好相应的评估。

8.1 创建索引

例如下表:

CREATE TABLE employee(
	name 			STRING,
    salary			FLOAT,
    subordinates	ARRAY<STRING>,
    deductions		Map<STRING,STRING>,
    address			STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING);

下面我们对分区字段country建立索引:

CREATE INDEX employess_index
ON TABLE employees (country)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
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.';

在这种情况下,我们没有像原表那样对索引进行同一粒度的分区划分。其实我们是可以那么做。如果我们完全省略掉PARTITIONED BY 语句的话,那么索引将会包含原始表的所有分区。

AS … 语句指定了索引处理器,也就是一个实现了索引接口的Java类。Hive本身包含了一些典型的索引实现。这里用到的CompactIndexHandler就是其中一种实现。可通过第三方的实现来最优化地处理特定的场景,支持特定的文件格式等。

后面再讨论WITH DEFERRED REBUILD这个子句的含义

并非一定要求索引处理器在一张新表中保留索引数据,但是如果需要的话,会使用到IN TABLE … 子句。这个句式提供了和创建其他类型表一样的很多功能。

特别地,上例中没用到ROW FORMAT、STORED AS、STORED BY、LOCATION等,这些其实都可以在COMMENT语句前增加

目前,除了S3中的数据,对外部表和视图都是可以建立索引的。

Bitmap索引

Hive v0.8.0版本中增加了一个内置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.';

8.2 重建索引

如果用户指定了DEFERRED REBUILD,那么新索引将呈现空白状态。在任何时候,都可以进行第一次索引创建或者使用ALTER INDEX对索引进行重建:

ALTER INDEX employees_index
ON TABLE employees
PARTITION (country = 'US')
REBUILD;

如果省略掉PARTITION,那么将会对所有分区进行重建索引。

还没有一个内置机制能够在底层的表或者某个特定的分区发生改变时,自动触发重建索引。但是,如果用户具有一个工作流来更新分区表中的数据的话,那么用户可能已经在其中某处使用了 ALTER TABLE … TOUCH PARTITION(…) 功能,同样地,在这个工作流中也可以对对应的索引执行重建索引语句ALTER INDEX … REBUILD

如果重建索引失败,那么在重建开始之前,索引将停留在之前的版本状态。从这种意义上看,重建索引操作是原子性的。

8.3 显示索引

下面这个命令将显示对于这个索引表对所有列所建立的索引:

SHOW FORMATTED INDEX ON employees;

关键字FORMATTED可选。增加这个关键字可以使输出中包含有列名称。用户还可以替换INDEX为INDEXS,这样输出中就可以列举出多个索引信息了。

8.4 删除索引

如果有索引表的话,删除一个索引将会删掉这个索引表:

DROP INDEX IF EXISTS employees_index ON TABLE employees;

Hive不允许用户直接使用DROP TABLE语句之前删除索引表。

同理,如果原始表的某个分区被删除了,那么这个分区对应的分区索引也同时会被删除掉。

8.5 实现一个定制化索引处理器

大家可以参考 Hive Wiki页面具有实现一个定制化的索引处理器的完整例子。

https://cwiki.apache.org/confluence/display/Hive/IndexDev#CREATE_INDEX。其中还包含了索引的初步设计文档。当然大家也可以使用前面提到的 org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler中的源码为例来学习。

创建好索引后,实现索引处理器的Java代码中也要做一些初始验证和为索引表定义模式的过程。同时还要实现重建索引处理器逻辑,其会读取需要创建索引的表,然后写索引存储(例如索引表)。但索引被删除后,处理器还需要清理掉所有为索引所使用到的非表存储。如果需要,还要依赖Hive去删除索引表。处理器必须能够参与到优化查询中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值