Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。

Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要读取的数据块的数量。

在可以预见到分区数据非常庞大的情况下,索引常常是优于分区的。

  博主我推荐各位博文们通过查阅Hive文档对Hive表的索引进行更深入的了解。

  需要时刻记住的是,Hive并不像事物数据库那样针对个别的行来执行查询、更新、删除等操作。这些操作依赖高效的索引来实现高性能。

  Hive是一种批处理工具,通常用在多任务节点的场景下,快速地扫描大规模数据。关系型数据库则适用于典型的单机运行、I/O密集型的场景。

Hive通过并行化来实现性能,因此Hive更适用于全表扫描这样的操作,而不是像使用关系型数据库一样操作。

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

    Hive里的2维坐标系统(第一步定位行键 -> 第二步定位列修饰符)

HBase里的4维坐标系统(第一步定位行键 -> 第二步定位列簇 -> 第三步定位列修饰符 -> 第四步定位时间戳)

HBase里的4维坐标系统(第一步定位行键   ->   第二步定位列簇  ->  第三步定位列修饰符   ->  第四步定位时间戳)

   行键,相当于第一步级索引。

  列簇,相当于第二步级索引。

  列修饰符,相当于第三步级索引。

  时间戳,相当于第四步级索引。

预习案例

说明:
原表是user
创建索引后的表是user_index_table
索引是user_index

先创建原表

create table user(
id int,
name string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

往原表里导入数据

LOAD DATA LOCAL INPATH '/export1/tmp/wyp/row.txt' OVERWRITE INTO TABLE user;

给原表做个测试

SELECT * FROM user where id =500000;
Total MapReduce CPU Time Spent: 5 seconds 630 msec
OK
500000 wyp.
Time taken: 14.107 seconds, Fetched: 1 row(s)
可以看出,一共用了14.107s。

在原表user上创建索引user_index,得到创建索引后的表user_index_table

CREATE INDEX user_index ON TABLE user(id) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH deferred REBUILD IN TABLE user_index_table;
或者如下写都是一样的,建议如下写
hive > create index user_index on table user(id)
> as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
> with deferred rebuild
> IN TABLE user_index_table;

给原表user更新数据

ALTER INDEX user_index on user REBUILD;

删除索引

DROP INDEX user_index on user;

查看索引

SHOW INDEX on user;

 创建表和索引案例

步骤一:创建索引测试表

CREATE TABLE index_test(
id INT,
name STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED FILEDS TERMINATED BY ',';
说明:
创建一个索引测试表 index_test,dt作为分区属性,
“ROW FORMAT DELIMITED FILEDS TERMINATED BY ','” 表示用逗号分割字符串,默认为‘\001’。

步骤二:创建临时索引表

create table index_tmp(
id INT,
name STRING,
dt STRING
)
ROW FORMAT DELIMITED FILEDS TERMINATED BY ',';
说明:临时索引表是table index_tmp

步骤三:加载数据到临时索引表中

load data local inpath '/home/hadoop/djt/test.txt' into table index_tmp;

步骤四:设置 Hive 的索引属性来优化索引查询

set hive.exec.dynamic.partition.mode=nonstrict;----设置所有列为 dynamic partition
set hive.exec.dynamic.partition=true;----使用动态分区

步骤五:查询临时索引表中的数据,插入到索引测试表中。

insert overwrite table index_test partition(dt) select id,name,dt from index_tmp;

步骤六:使用 索引测试表,在属性 id 上创建一个索引

create index index1_index_test on table index_test(id) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH DEFERERD REBUILD;
建议如下写
create index index1_index_test on table index_test(id)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERERD REBUILD;
索引是index1_index_test
索引测试表是 index_test
在索引测试表的属性id上创建的索引

步骤七:填充索引测试表的索引数据

alter index index1_index_test on index_test rebuild;

步骤八:查看索引测试表的创建的索引

show index on index_test

步骤九:查看索引测试表的分区信息

show partitions index_test;

步骤十:查看索引测试表的索引数据

$ hadoop fs -ls /usr/hive/warehouse/default_index_test_index1_index_test_

步骤十一:删除索引测试表的索引

drop index index1_index_test on index_test;
show index on index_test;

步骤十二:索引测试表的索引数据也被删除

$ hadoop fs -ls /usr/hive/warehouse/default_index_test_index1_index_test_
no such file or directory

步骤十三:修改配置文件信息

hive.optimize.index.filter 和 hive.optimize.index.groupby 参数默认是 false。
使用索引的时候必须把这两个参数开启,才能起到作用。
hive.optimize.index.filter.compact.minsize 参数
为输入一个紧凑的索引将被自动采用最小尺寸、默认5368709120(以字节为单位)。

Hadoop Hive概念学习系列之hive里的索引(十三)的更多相关文章

  1. Hadoop Hive概念学习系列之hive里的扩展接口(CLI、Beeline、JDBC)(十六)

    <Spark最佳实战  陈欢>写的这本书,关于此知识点,非常好,在94页. hive里的扩展接口,主要包括CLI(控制命令行接口).Beeline和JDBC等方式访问Hive. CLI和B ...

  2. Hadoop Hive概念学习系列之hive里如何显示当前数据库及传参(十九)

    这个小知识点,看似简单,用处极大. $ hive --hiveconf hive.cli.print.current.db=true $ hive --hiveconf hive.cli.print. ...

  3. Hadoop Hive概念学习系列之hive三种方式区别和搭建、HiveServer2环境搭建、HWI环境搭建和beeline环境搭建(五)

     说在前面的话 以下三种情况,最好是在3台集群里做,比如,master.slave1.slave2的master和slave1都安装了hive,将master作为服务端,将slave1作为服务端. 以 ...

  4. Hadoop Hive概念学习系列之hive的索引及案例(八)

    hive里的索引是什么? 索引是标准的数据库技术,hive 0.7版本之后支持索引.Hive提供有限的索引功能,这不像传统的关系型数据库那样有“键(key)”的概念,用户可以在某些列上创建索引来加速某 ...

  5. Hadoop Hive概念学习系列之hive里的优化和高级功能(十四)

    在一些特定的业务场景下,使用hive默认的配置对数据进行分析,虽然默认的配置能够实现业务需求,但是分析效率可能会很低. Hive有针对性地对不同的查询进行了优化.在Hive里可以通过修改配置的方式进行 ...

  6. Hadoop Hive概念学习系列之hive里的分区(九)

    为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”. 分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助. 分 ...

  7. Hadoop Hive概念学习系列之hive里的JDBC编程入门(二十二)

    Hive与JDBC示例 在使用 JDBC 开发 Hive 程序时, 必须首先开启 Hive 的远程服务接口.在hive安装目录下的bin,使用下面命令进行开启: hive -service hives ...

  8. Hadoop Hive概念学习系列之hive里的用户定义函数UDF(十七)

    Hive可以通过实现用户定义函数(User-Defined Functions,UDF)进行扩展(事实上,大多数Hive功能都是通过扩展UDF实现的).想要开发UDF程序,需要继承org.apache ...

  9. Hadoop Hive概念学习系列之hive里的视图(十二)

    不多说,直接上干货! 可以先,从MySQL里的视图概念理解入手 视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,与基本表不同,它是一个虚表.在数据库中,存放的只是视图的定义,而不存放视图包含的 ...

随机推荐

  1. 洛谷2016 战略游戏 (0/1状态的普通树形Dp)

    题意: 给出一个树,覆盖树上某一个点的花费为w[i],求树上每一条边至少有一个点覆盖的最小花费. 细节: 1.一条边的两端可以均被覆盖,但是不能存在一条边的两端都不被覆盖. 2.可能存在 分析: 对于 ...

  2. 简单的发红包的PHP算法

    假设有有10元钱 ,发给10个人.保证每个人都有钱拿,最少分得0.01.我们最先想到的肯定就是随机.0.01-10随机.但是会出现第一个人就分得9.99的情况.下面就没人可分了.然后就是我的错误思路 ...

  3. 【Java 理论篇 1】Java2平台的三个版本介绍

    导读:关于java的三种分类J2SE.J2EE.J2ME,在网上有很多资料,然后自己写的,也大多是从各个网站上搜罗里的.算是自己的一种笔记,或者明白的说,就是把别人的东西抄一遍.但是,这对于我来说,也 ...

  4. 使用using current logfile实现DG备库实时更新

    DG1是主库,DG2是备库:运行在最大可用模式. 实验一:未使用using current logfile参数时,备库在最大可用模式下,不能实时同步备库的更新 -此时需要等待主库进行归档---侧面证明 ...

  5. bzoj 1503[NOI 2004] 郁闷的出纳员

    题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...

  6. PHP日历程序编写(简单实现)

    <meta charset="utf-8"><?php $year = isset($_GET['year']) ? $_GET['year'] : date(& ...

  7. 八数码难题 双向搜索(codevs 1225)

    题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.问题描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字 ...

  8. HDU 1074 Doing Homework【状态压缩DP】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...

  9. 如何使用google解决问题

    如何使用google解决问题 redguardtoo著 文章选自2004年<程序员>杂志第8期P56 前面收集了篇如何问问题的文章就是<学会提问>http://blog.pro ...

  10. [vijos1891]学姐的逛街计划

                                                                     学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, d ...