作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处

从Hive的官方wiki来看,Hive0.7以后增加了一个对表建立index的功能,想试下性能是否有很大提升,参考了一些资料亲手实现了一遍,记录下过程和心得

一.测试数据准备

1.新建一个gen-data.sh脚本,内容如下

#! /bin/bash
#generating 1.7G raw data.
i=0
while [ $i -ne 5000000 ]
do
echo "$i A decade ago, many were predicting that Cooke, a New York City prodigy, would become a basketball shoe pitchman and would flaunt his wares and skills at All-Star weekends like the recent aerial show in Orlando, Fla. There was a time, however fleeting, when he was more heralded, or perhaps merely hyped, than any other high school player in America."
i=$(($i+1))
done

2.生成文件

执行如上脚本: sh gen-data.sh >dual.txt,大约几分钟后生成完毕.

二.Hive建立表和索引

1.建表,注意和上面生成的数据是一致的,id和name以制表符隔开进行映射

create table table01(id int,name string) row format delimited fields terminated by '\t';

2.加载数据到表中

load data local inpath '~/testData/hive/dataScripts/dual.txt' overwrite into table table01; (用时Time taken: 160.787 seconds)

3.创建table02,数据来自于table01

create table table02 as select id ,name as text from table01; (Time taken: 154.463 seconds)

4.查询测试

select * from table02 where id=500000; (Time taken: 30.463 seconds, Fetched: 1 row(s))

此时dfs -ls /user/hive/warehouse/,会看到有table01和table02对应的数据文件夹生成

5.利用hive的CompactIndexHandler为id字段自动创建索引

create index table02_index on table table02(id) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild;

alter index table02_index on table02 rebuild;  (Time taken: 112.451 seconds)

注意上面这句是必要的,因为deferred rebuild以后,索引文件内容初始化是empty的,而alter index能够帮助重建index structure.

6.此时会看到索引表的生成,查看索引表内容

hive> select * from default__table02_table02_index__ limit 3;
OK
9    hdfs://littleNameservice/user/hive/warehouse/table02/000000_0    [3168]
36    hdfs://littleNameservice/user/hive/warehouse/table02/000000_0    [12698]
63    hdfs://littleNameservice/user/hive/warehouse/table02/000000_0    [22229]

这里可以看到索引表分为三列,分别是索引列的枚举值,每个值对应的数据文件位置,以及在这个文件位置中的偏移量。通过这种方式,

可以减少查询的数据量(偏移量可以告诉你从哪个位置开始找,自然只需要定位到相应的block),起到减少资源消耗的作用.

7.再次查询测试

select * from table02 where id=500000; (Time taken: 29.226 seconds, Fetched: 1 row(s))

对比刚开始的30.463秒,基本没变化。所以继续研究

8.需要进行索引手动裁剪,如下

SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
Insert overwrite directory "/tmp/table02_index_data" select `_bucketname`, `_offsets` from  default__table02_table02_index__ where id =500000;
Set hive.index.compact.file=/tmp/table02_index_data;
Set hive.optimize.index.filter=false;
Set hive.input.format=org.apache.hadoop.hive.ql.index.compact.HiveCompactIndexInputFormat;

简单解释下上面命令的意思就是对自己需要索引的查询比如id = 500000,手动从已有的索引表default__table02_table02_index__ 中裁剪出来插入临时的tmp目录,然后设置索引的文件

指向和忽略自动索引

9.最终查询测试

select * from table02 where id =500000; (Time taken: 17.259 seconds, Fetched: 1 row(s))

好,这次变成17秒了,证明索引生效了.但是感觉差强人意啊.

个人总结:从官方的wiki,jira以及自己的测试来看,Hive的索引很不好用,它并不是传统的的B树索引,而是冗余了一个lookup的索引表,把需要索引的表简单划分了range和偏移量,

这些信息被储存在索引表里面进行查询,而且使用的时候不能直接用,还要根据条件进行裁剪才会真正生效。个人感觉这就是个半成品,官方也宣称这块儿功能需要加强.

参考资料:

https://cwiki.apache.org/confluence/display/Hive/IndexDev

https://issues.apache.org/jira/browse/HIVE-417

http://lxw1234.com/archives/2015/05/207.htm

http://blog.csdn.net/liwei_1988/article/details/7319030

Hive索引功能测试的更多相关文章

  1. Hive索引

    1.        Hive索引概述 Hive的索引目的是提高Hive表指定列的查询速度. 没有索引时.类似'WHERE tab1.col1 = 10' 的查询.Hive会载入整张表或分区.然后处理全 ...

  2. HIVE—索引、分区和分桶的区别

    一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapRed ...

  3. hive索引表

    create table index_tmp(id int,name string,dt string) row format delimited fields terminated by ',' s ...

  4. hive 索引

    hive 有限的支持索引,不支持主键外键,可以对表添加索引,也可以为某个分区添加索引.维护索引也要额外的存储空间和计算资源. 创建索引需要指定索引处理器 如 as 'org.apache.hadoop ...

  5. 【Hive学习之六】Hive Lateral View &视图&索引

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  6. Hadoop Hive概念学习系列之hive里的索引(十三)

    Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要 ...

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

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

  8. Hive 学习之路(六)—— Hive 视图和索引

    一.视图 1.1 简介 Hive 中的视图和RDBMS中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条SELECT语句的结果集.视图是纯粹的逻辑对象,没有关联的存储(Hive 3.0.0引入的 ...

  9. Hive 系列(六)—— Hive 视图和索引

    一.视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集.视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0 ...

随机推荐

  1. Java8实战分享

    虽然很多人已经使用了JDK8,看到不少代码,貌似大家对于Java语言or SDK的使用看起来还是停留在7甚至6. Java8在流式 or 链式处理,并发 or 并行方面增强了很多,函数式的风格使代码可 ...

  2. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  3. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  4. Intel Media SDK H264 encoder GOP setting

    1 I帧,P帧,B帧,IDR帧,NAL单元 I frame:帧内编码帧,又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随 ...

  5. Javascript正则对象方法与字符串正则方法总结

    正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...

  6. javascript运动系列第一篇——匀速运动

    × 目录 [1]简单运动 [2]定时器管理 [3]分享到效果[4]移入移出[5]运动函数[6]透明度[7]多值[8]多物体[9]回调[10]函数完善[11]最终函数 前面的话 除了拖拽以外,运动也是j ...

  7. JDBC简介

    jdbc连接数据库的四个对象 DriverManager  驱动类   DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 ...

  8. 微信小程序开发—快速掌握组件及API的方法

    微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...

  9. mysql 行级锁的使用以及死锁的预防

    一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...

  10. 第13章 Linux日志管理

    1. 日志管理 (1)简介 在CentOS 6.x中日志服务己经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式其 ...