作者: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. 05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  2. WPF 微信 MVVM

    公司的同事离职了,接下来的日子可能会忙碌,能完善DEMO的时间也会少了,因此,把做的简易DEMO整体先记录一下,等后续不断的完善. 参考两位大神的日志:WEB版微信协议部分功能分析.[完全开源]微信客 ...

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

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

  4. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  5. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  6. python基础

    内容概要: 一.python2 or python3 目前大多使用python2.7,随着时间的推移,python3将会成为python爱好者的主流. python2和3区别: 1.PRINT IS ...

  7. 海康网络摄像机YV12转换为BGR,由opencv Mat显示 (转)

    我使用的是海康DS-2CD852MF-E, 200万,网络摄像机,已经比较老了,不过SDK在海康官网下载的,开发流程都差不多. 海康摄像机回调解码后的视频数据格式为YV12,顺便说一下YV12的数据格 ...

  8. iOS从零开始学习直播之3.美颜

      任何一款直播软件都必须进行美颜,不然哪来的那么多美女,所以技术改变世界,不只是说说而已.美颜在采集的时候就得就行,让主播实时看到直播的效果. 1.美颜原理   其实美颜的本质就是美白和磨皮,分别通 ...

  9. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...

  10. 为什么你SQL Server的数据库文件的Date modified没有变化呢?

    在SQL Server数据库中,数据文件与事务日志文件的修改日期(Date Modified)是会变化的,但是有时候你会发现你的数据文件或日志文件的修改日期(Date Modified)几个月甚至是半 ...