作者: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. .NET Core系列 :4 测试

    2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...

  2. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  3. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  4. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. linux应用调试技术之GDB和GDBServer

    1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...

  6. mount报错: you must specify the filesystem type

    在linux mount /dev/vdb 到 /home 分区时报错: # mount /dev/vdb /homemount: you must specify the filesystem ty ...

  7. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  8. RunLoop 总结:RunLoop的应用场景(一)

    参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料.关于iOS 中的RunLoop资料非 ...

  9. VS2015墙内创建ionic2

    开始学习ionic2,试验各种方法,感觉以下是紧跟rc版本的最佳方案 STEP1 设置cnpm npm install -g cnpm --registry=https://registry.npm. ...

  10. Mysql - 函数

    Mysql提供的函数是在是太多了, 很多我都见过, 别说用了. 园子里面, 有人弄了一个比较全的. MYSQL函数 我这里会将他写的完全拷贝下来, 中间会插入一些自己项目中使用过的心得 一.数学函数 ...