hive索引机制和原理_王玉Student的博客-CSDN博客_hive 索引

标签: | 发表时间:2020-06-21 10:01 | 作者:
出处:https://blog.csdn.net

hive索引介绍


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

hive索引机制和原理
在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量; 

在执行索引字段查询时候,首先额外生成一个MR job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的hdfs文件路径及偏移量,输出到hdfs上的一个文件中,然后根据这些文件中的hdfs路径和偏移量,筛选原始input文件,生成新的split,作为整个job的split,这样就达到不用全表扫描的目的。

      select * from t_student where name = 'zzq';

 

首先用一个job,从索引表中过滤出key = ‘zzq’的记录,将其对应的HDFS文件路径及偏移量输出到HDFS临时文件中 
接下来的job中以临时文件为input,根据里面的HDFS文件路径及偏移量,生成新的split,作为查询job的map任务input

不使用索引时候,如下图所示: 
--------------------- 

table t_student的每一个split都会用一个map task去扫描,但其实只有split2中有 我们想要的结果数据,map task1和map task3造成了资源浪费。

使用索引后,如下图所示: 

 查询提交后,先用一个MR,扫描索引表,从索引表中找出key=’xx’的记录,获取到HDFS文件名和偏移量; 
接下来,直接定位到该文件中的偏移量,用一个map task即可完成查询,其最终目的就是为了减少查询时候的input size

hive索引优点

索引可以避免全表扫描和资源浪费 
索引可以加快含有group by语句的查询的计算速度

创建索引表

对已有的表t_student根据name新建索引命名为student_index保存在表student_index_table中。

 

      create index student_index on table t_student(name)
as  'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
with deferred rebuild
in table student_index_table ;

注意,创建完索引表后里面是空的,需要重建索引才会有索引的数据。

重建索引(生成索引数据)

      alter index student_index on t_student rebuild;

 自动使用索引

      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;

删除索引 

      DROP INDEX student_index on t_student;

 查看索引

      SHOW INDEX on t_student;

缺点
从以上过程可以看出,Hive索引的使用过程比较繁琐: 
每次查询时候都要先用一个job扫描索引表,如果索引列的值非常稀疏,那么索引表本身也会非常大; 
索引表不会自动rebuild,如果表有数据新增或删除,那么必须手动rebuild索引表数据;

总结
我们可以发现Hive的索引功能现在还相对较晚,提供的选项还较少。但是,索引被设计为可使用内置的可插拔的java代码来定制,用户可以扩展这个功能来满足自己的需求。 当然不是说所有的查询都会受惠于Hive索引。用户可以使用EXPLAIN语法来分析HiveQL语句是否可以使用索引来提升用户查询的性能。像RDBMS中的索引一样,需要评估索引创建的是否合理,毕竟,索引需要更多的磁盘空间,并且创建维护索引也会有一定的代价。 用户必须要权衡从索引得到的好处和代价。
 

相关 [hive 索引 原理] 推荐:

Hive创建索引

- - CSDN博客推荐文章
  写在前面的话,学 Hive这么久了,发现目前国内还没有一本完整的介绍 Hive的书籍,而且互联网上面的资料很乱,于是我决定写一些关于《 Hive的那些事》序列文章,分享给大家. 我会在接下来的时间整理有关 Hive的资料,如果对Hive的东西感兴趣,请关注本博客.   Hive的数据分为表数据和元数据,表数据是Hive中表格(table)具有的数据;而元数据是用来存储表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等.

hive索引机制和原理_王玉Student的博客-CSDN博客_hive 索引

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

Hive中Join的原理和机制

- - 编程语言 - ITeye博客
Hive中Join的原理和机制. 笼统的说,Hive中的Join可分为Common Join(Reduce阶段完成join)和Map Join(Map阶段完成join). 本文简单介绍一下两种join的原理和机制. 如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join.

索引原理

- - ITeye博客
索引是存储引擎用于快速找到记录的一种数据结构. 也就会说索引也是一种数据结构,也占用磁盘空间. 索引是对查询优化最有效的手段,可以将查询提升几个数量级,相当牛掰啊. 1)索引大大减少了服务器需要扫描的数据量. 2)索引可以帮助服务器避免排序和临时表. 3)索引可以将随机IO变为顺序IO. 数据库索引可以想象成一本书的目录,如果想在一本书中找到某个主题,那么先到书的目录中找到这个主题,然后根据目录提供的页码,找到要找的主题.

大数据时代--Hive技术原理解析

- - zzm
Hive的运行原理,帮助使用者更好的了解在使用的过程中它做了些什么工作,深入的理解他的工作机制,提高开发人员理论层面的知识.        Hive是建立在 Hadoop 上的数据仓库基础构架. 它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制.

hive调优

- - 互联网 - ITeye博客
一、    控制hive任务中的map数: . 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);.

hive 优化 tips

- - CSDN博客推荐文章
一、     Hive join优化. 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key. 2.     注意带表分区的join, 如:.

Hive中的join

- - CSDN博客云计算推荐文章
select a.* from a join b on a.id = b.id select a.* from a join b on (a.id = b.id and a.department = b.department). 在使用join写查询的时候有一个原则:应该将条目少的表或者子查询放在join操作符的左边.

hive优化(2)

- - 开源软件 - ITeye博客
Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具. 使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别,. 所以需要去掉原有关系型数据库下开发的一些固有思维. 1:尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段.

hive优化

- - 开源软件 - ITeye博客
hive.optimize.cp=true:列裁剪. hive.optimize.prunner:分区裁剪. hive.limit.optimize.enable=true:优化LIMIT n语句. hive.limit.optimize.limit.file=10:最大文件数.   1.job的输入数据大小必须小于参数:hive.exec.mode.local.auto.inputbytes.max(默认128MB).