posts - 110, comments - 101, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

htable coprocessor使用

Posted on 2012-08-16 17:30 云云 阅读(1161) 评论(1)  编辑  收藏
在网浏览的时候  发现了这篇文章  很有用  就保留了下来

hbase不是数据库,一些数据库中基本的功能hbase并不具备.
二级索引就是其中很重要的一点,在数据库中索引是在平常不过的功能了.
而在hbase中,value上的索引只能靠自己来实现.

hbase中最简单的二级索引的实现方式是通过另外一个hbase表来实现.
下面通过postput方法,实现对表sunwg01的二级索引.

举例说下二级索引实现:
表sunwg01的f1:k1有如下记录
100 tom
101 mary

对于表sunwg01来说,可以通过100,101直接访问记录,但是如果想要访问mary这条记录,则只能全表遍历
为了解决这个问题,创建了表sunwg02
表sunwg02中的f1:k1有如下记录
tom 100
mary 101

现在如果要查找mary这条记录,可以先查表sunwg02中,找到mary的value的为101

下面通过postput方式实现,在put源表的同时更新索引表的功能。
详细代码如下:

import java.io.IOException; import java.util.Iterator; import java.util.List;   import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; import org.apache.hadoop.hbase.regionserver.wal.WALEdit;   public class postput_test extends BaseRegionObserver {         @Override      public void postPut(final ObserverContext<RegionCoprocessorEnvironment> e,           final Put put, final WALEdit edit, final boolean writeToWAL) throws IOException {             HTable table = new HTable("sunwg02");           List<KeyValue> kv = put.get("f1".getBytes(), "k1".getBytes());           Iterator<KeyValue> kvl = kv.iterator();             while(kvl.hasNext()) {               KeyValue tmp = kvl.next();               Put tput = new Put(tmp.getValue());               tput.add("f1".getBytes(),"k1".getBytes(),tmp.getRow());               table.put(tput);             }           table.close();       } 






评论

# re: htable coprocessor使用   回复  更多评论   

2013-08-09 15:33 by jxauwxj@126.com
请问一下,我试了好次,都没成功自动创建索引。请问大神你是如何做的?谢谢


只有注册用户登录后才能发表评论。


网站导航: