赞
踩
一、索引的作用
Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。
Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要读取的数据块的数量。
在可以预见到分区数据非常庞大的情况下,索引常常是优于分区的。
虽然Hive并不像事物数据库那样针对个别的行来执行查询、更新、删除等操作。它更多的用在多任务节点的场景下,快速地全表扫描大规模数据。但是在某些场景下,建立索引还是可以提高Hive表指定列的查询速度。(虽然效果差强人意)
二、索引适用的场景
适用于不更新的静态字段。以免总是重建索引数据。每次建立、更新数据后,都要重建索引以构建索引表。
Hive索引的机制如下:
hive在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量;
v0.8后引入bitmap索引处理器,这个处理器适用于排重后,值较少的列(例如,某字段的取值只可能是几个枚举值)
因为索引是用空间换时间,索引列的取值过多会导致建立bitmap索引表过大。
但是,很少遇到hive用索引的,说明还是有缺陷or不合适的地方的,3.0 后hive去掉了索引.
三、索引的建立与使用
create index index_name
on table base_table_name (col_name, ...)
as 'index.handler.class.name'
[with deferred rebuild]
[idxproperties (property_name=property_value, ...)]
[in table index_table_name]
[partitioned by (col_name, ...)]
[
[ row format ...] stored as ...
| stored by ...
]
[location hdfs_path]
[tblproperties (...)]
[comment "index comment"]
as ‘index.handler.class.name’ 指定索引处理器,这里的一般使用org.apache.hadoop.hive.ql.index.compact.compactindexhandler 这个处理器。
[with deferred rebuild] 表明创建一个空索引,也就是说现在还不创建索引
[in table index_table_name] 索引存储在哪个表中。
[idxproperties (property_name=property_value, …)] 索引的参数。一般使用idxproperties (‘creator’ = ‘me’,‘created_at’ = ‘some_time’),代表创建者和创建时间。
[partitioned by (col_name, …)]
[
[ row format …] stored as …
| stored by …
]
表明只对某个分区创建索引,若没有该选项则表示对所有分区都创建索引,另外要注意的是index的分区索引默认是和表的分区一致的,也不能对视图view创建索引。
例如:
create index index_bill_id on table t_travel_members_m (bill_id)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild;
显示索引
show index on t_travel_members_m;
重建数据
建立完索引之后 需要重建索引数据,会触发一个mr job
alter index index_bill_id on t_travel_members_m rebuild;
删除索引
drop index if exists index_bill_id on t_travel_members_m;
使用索引
set hive.input.format=org.apache.hadoop.hive.ql.io.hiveinputformat;
set hive.optimize.index.filter=true;
set hive.optimize.index.filter.compact.minsize=0;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。