HiveQL索引

HiveQL索引


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

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

Hive中的索引和那些关系型数据库中的一样,需要进行仔细评估才能使用。维护索引也需要额外的存储空间,同时创建索引也需要消耗计算资源。用户需要在建立索引为查询带来的好处和因此而需要付出的代价之间做出权衡。

创建索引

CREATE INDEX indexname
ON TABLE tablename [(cloname)]
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 
WITH DEFERRED REBUILD;

这是简单创建索引的语句,还有一些其他的内容可以加进来,当需要时再补充。

[外链图片转存失败(img-K87PjL5i-1568856727643)(D:\学习笔记\Hive编程指南截图\保存图片\Hive中的表\12创建索引.jpg)]

as… 语句指定了索引处理器,也就是一个实现索引接口的Java类。Hive本身包含了一些典型的索引实现。具体见我另一篇博客。

除了内部表,Hive还可以对外部表和视图建立索引。

重建索引

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

如果在重建时省略掉了 PARTTION 那么将会对所有分区进行重建索引。

显示索引

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

SHOW FORMATTED INDEX ON employees;

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

删除索引

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

DROP INDEX IF EXISTS employees index ON TABLE employees;

Hive 不允许用户直接使用DROP TABLE 语句之前删除索引表。而通常情况下,IF EXISTS 都是可选的,其用于当索引不存在时避免抛出错误信息。
如果被索引的表被删除了,那么其对应的索引和索引表也会被删除。同样地,如果原始表的某个分区被删除了,那么这个分区对应的分区索引也同时会被删除掉。

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

Hive Wiki 相关链接

索引的其他信息见我的另外一篇博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章