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
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;
创建成功
ALTER INDEX customers_index on customers REBUILD;
更新成功,用时1m2s
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中的索引一样,须要评估索引创建的是否合理,毕竟。索引须要很多其它的磁盘空间,而且创建维护索引也会有一定的代价。 用户必需要权衡从索引得到的优点和代价。
因篇幅问题不能全部显示,请点此查看更多更全内容