分享

hbase如何实现查字典式的快速查询?

395455030 发表于 2016-1-27 15:03:23 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 7 10320
    如果要从英语字典中查一个“d”开头单词,遍历整个字典要花很多时间,而根据目录忽略掉a、b、c、e等开头的单词,只搜索d开头的单词就会快一些。现在刚开始用hbase,我就想用这种字典式的搜索方法。
    hbase的row是不是就是rowkey?看hbase的文档说row说着说着突然冒出一个rowkey,真晕。好像hbase的表会根据这个排序分类,所以根据这个查就能比较快,不过这个好像是按字符串顺序排的?那这样8、9、10、11中10要排8、9前面,想要按数字顺序排怎么办?如果用在数字前补0的办法也不知道要补几个0。
    row、rowkey按顺序排,查找时能获得比较快的速度,但可能需要根据其他列来查询,应该可以用其他列建立一个目录。看官网提到了一个secondary indexes好像是用来做这个的,可是官网说了一堆也没说这个具体怎么用?我想要的是有没有这么一条命令,类似输入“建立索引关键字 '表名','列名'”就实现了效果。求教hbase建立索引实现目录式查询的命令。
    我目前都在hbase shell里用脚本操作,将来可能还要用java写程序,java操作hbase有什么教程给推荐下吗?

已有(7)人评论

跳转到指定楼层
bob007 发表于 2016-1-27 15:42:48
hbase 不适合多条件查询,可以将查询的列放入到rowkey中。
二级索引的资料推荐
HBase二级索引实现方案
http://www.aboutyun.com/thread-14321-1-1.html


还有一种方案
hbase+solr这个是搜索引擎。
企业hbase二级索引应该就可以了

回复

使用道具 举报

395455030 发表于 2016-1-27 15:59:17
bob007 发表于 2016-1-27 15:42
hbase 不适合多条件查询,可以将查询的列放入到rowkey中。
二级索引的资料推荐
HBase二级索引实现方案

    各行的rowkey值是不能重复的吧,这就使rowkey基本只能用来存1、2、3这样的编号。很多要搜索的条件都是可以重复的,这就不能作为rowkey了。
    你给的那个网址里说的“调用HBaseAdmin的createTable(...)”什么意思,是使用java吗?有没有在hbase shell里用ruby脚本的方法?

回复

使用道具 举报

bob007 发表于 2016-1-27 16:17:55
395455030 发表于 2016-1-27 15:59
各行的rowkey值是不能重复的吧,这就使rowkey基本只能用来存1、2、3这样的编号。很多要搜索的条件都 ...

缺点:
hbase适合简单的查询,没有关系数据库灵活
优点:
在大数据中,简单查询特别快,比如google使用的是bigtable。
hbase模仿是就是bigtable.
多个查询条件或则查询条件是不定的,这个对于hbase来说有点难度
回复

使用道具 举报

bob007 发表于 2016-1-27 16:26:10
如果要使用脚本,可以看Hbase的bin 目录.在里面找到后缀为 *.rb的脚本.要想运行这个脚本,要这样

$ ./bin/hbase org.jruby.Main PATH_TO_SCRIPT

回复

使用道具 举报

395455030 发表于 2016-1-27 23:14:50
bob007 发表于 2016-1-27 16:26
如果要使用脚本,可以看Hbase的bin 目录.在里面找到后缀为 *.rb的脚本.要想运行这个脚本,要这样

$ ./bi ...

    我也没说要做多条件查询啊,虽然将来可能需要,现在先想好单条件的怎么做。bin目录里有哪个脚本运行了能产生索引表吗?
    HFile中有一部分叫做DataIndex,我原先以为HBase自带创建索引表的功能,并把索引表放在这个位置。现在看来想要建索引表是不是要自己另外建个,索引表就是自己建的一个普通表?那DataIndex是干嘛用的呢?

回复

使用道具 举报

bob007 发表于 2016-1-28 11:26:44
395455030 发表于 2016-1-27 23:14
我也没说要做多条件查询啊,虽然将来可能需要,现在先想好单条件的怎么做。bin目录里有哪个脚本运行 ...

Data Index和Meta Index块记录了每个Data块和Meta块的起始点
####################################
IndexTable的创建主要出现在两个时机,一是创建新DataTable时,系统根据索引定义,自动创建对应的IndexTable;
二是对已存在的DataTable,用户调用接口方法,动态创建索引。

hbase shell楼主可以自己创建
###################################
代码:
IndexTable的创建过程如下:
第一步,获取DataTable的所有RegionInfo,得到所有DataTable Region的StartKey。
第二步,结合索引定义和DataTable Region的StartKey信息,调用HBaseAdmin的createTable(final HTableDescriptor desc, byte [][] splitKeys)方法创建索引表



回复

使用道具 举报

395455030 发表于 2016-1-29 10:18:01
bob007 发表于 2016-1-28 11:26
Data Index和Meta Index块记录了每个Data块和Meta块的起始点
####################################
In ...

    看了一下,使用Coprocessor可以在对表读写时再附加一些动作。静态装载Coprocessor即写在hbase-site.xml是针对所有表的,动态装载即写在java程序中只针对一张表。那是不是只能用动态装载不能用静态装载?因为只是想在主表插入时附带向索引表插入的动作,而动态装载针对所有表会在向索引表插入后也加上附加动作。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条