Hive索引的创建与性能测试

简介

Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。
Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要读取的数据块的数量。
在可以预见到分区数据非常庞大的情况下,索引常常是优于分区的。
需要时刻记住的是,Hive并不像事物数据库那样针对个别的行来执行查询、更新、删除等操作。这些操作依赖高效的索引来实现高性能。
Hive是一种批处理工具,通常用在多任务节点的场景下,快速地扫描大规模数据。关系型数据库则适用于典型的单机运行、I/O密集型的场景。
Hive通过并行化来实现性能,因此Hive更适用于全表扫描这样的操作,而不是像使用关系型数据库一样操作。

为什么要创建索引?

Hive的索引目的是提高Hive表指定列的查询速度。
没有索引时,类似’where id = ‘38715’’ 的查询,Hive会加载整张表或分区,然后处理所有的rows,
但是如果在字段id上面存在索引时,那么只会加载和处理文件的一部分。
与其他传统数据库一样,增加索引在提升查询速度时,会消耗额外资源去创建索引和需要更多的磁盘空间存储索引。
Hive 0.7.0版本中,加入了索引。Hive 0.8.0版本中增加了bitmap索引。

给原表做个测试

select * from customers where id = '21216'

可以看出一共用了5.46s

在原表customers上创建索引customers_index,得到创建索引后的表customers_index_table

create index customers_index on table customers(id) 
 as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 
 with deferred rebuild
 IN TABLE customers_index_table;

创建成功

给原表customers 更新数据

 ALTER INDEX customers_index on customers REBUILD;

更新成功,用时1m2s

查看表customers的索引

SHOW INDEX on customers

测试一下添加索引后的性能

select * from customers where id = '42109'

执行速度非常快,不到1s,对于这种where id条件的提升非常大

删除索引

DROP INDEX customers_index on customers;

执行成功

备注

hive.optimize.index.filter 和 hive.optimize.index.groupby 参数默认是 false。
使用索引的时候必须把这两个参数开启,才能起到作用。

总结

hive 0.7版本号之后支持索引。
Hive提供有限的索引功能。这不像传统的关系型数据库那样有“键(key)”的概念,用户能够在某些列上创建索引来加速某些操作。给一个表创建的索引数据被保存在另外的表中。
Hive的索引功能如今还相对较晚,提供的选项还较少。
可是,索引被设计为可使用内置的可插拔的java代码来定制,用户能够扩展这个功能来满足自己的需求。
当然不是说有的查询都会受惠于Hive索引。用户能够使用EXPLAIN语法来分析HiveQL语句能否够使用索引来提升用户查询的性能。
像RDBMS中的索引一样,须要评估索引创建的是否合理,毕竟。索引须要很多其它的磁盘空间,而且创建维护索引也会有一定的代价。 用户必需要权衡从索引得到的优点和代价。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值