【大数据】HiveQL:索引

HiveQL:索引

Hive 只有有限的索引功能。Hive 中没有普通关系型数据库中键的概念,但是还是可以对一些字段建立索引来加速某些操作的。一张表的索引数据存储在另外一张表中。这是一个相对比较新的功能,所以目前还没有提供很多的选择。

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

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

我们为上述表建立一个索引。

CREATE INDEX employees_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 类。
  • 并非一定要求索引处理器在一张新表中保留索引数据,但是如果需要的话,会使用到 IN TABLE 子句。
  • 如果用户指定了 DEFERRED REBUILD,那么新索引将呈现空白状态。在任何时候都可以进行第一次索引创建,或者使用 ALTER INDEX 对索引进行重建。

显示索引

SHOW FORMATTED INDEX ON employees;

删除索引

DROP INDEX IF EXISTS employees_index ON TABLE employees;

Hive 不允许用户直接使用 DROP TABLE 语句之前删除索引表。而通常情况下,IF EXISTS 都是可选的,避免了当索引不存在时抛出错误信息。

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

参考:《Hive 编程指南》

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G皮T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值