HBase的条件查询

一、环境

HBase版本hbase-0.20.5,Hadoop的版本hadoop-0.20.2,JDK1.6

二、需求背景

在HBase中,进行条件查询,很多的文件都说过,但是大多数都是在说明如何设置合理的表结构以及如何设置rowkey进行查询检索,这样的结构设计可以在一定层度上通过rowkey来定位查询(速度很快),但是,如果我是已知某个列的值,需要看有多少行的列包含这个值,那么这样的需求通过rowkey来查询就显得不合适。最早我的想法是查询内容,然后遍历,但是这样的效率明显是很低下的,所以,我寻求了其他的解决办法。

三、操作过程

1、一些已知rowkey这样的查询内容我就不在这里描述,网络上有很多这样的内容,我在下面只是说在已知列值的情况下进行的一些查询工作。

2、阅读API,发现了一个SingleColumnValueFilter类,就看名字大概知道作用,细看,然后查了些资料,编写了代码如下,先看代码:
public class HBaseFilterTest {

public static void main(String[] args) {
try {
HBaseConfiguration conf = new HBaseConfiguration();
conf.set("hbase.master.port", "IP:PORT");
conf.set("hbase.zookeeper.quorum", "IP");
HTable table = new HTable(conf, "scores");
Filter course_art_filter = new SingleColumnValueFilter(Bytes.toBytes("course"), Bytes.toBytes("art"),
CompareOp.EQUAL, Bytes.toBytes("art"));
Scan s = new Scan();
s.setFilter(course_art_filter);
// 指定之后,将只返回一个cell,也就是指定的那一个
// s.addColumn(Bytes.toBytes("course"), Bytes.toBytes("art"));
ResultScanner scanner = table.getScanner(s);
scanner = table.getScanner(s);
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
System.out.println("rowkey = " + new String(rr.getRow()));
System.out.println("first cell value = " + rr.getCellValue());
System.out.println("cell[] length = " + rr.getCellValues().length);
System.out.println("getCellValues()[2] = " + rr.getCellValues()[2]);
System.out.println("get local cell value = "
+ rr.getCellValue(Bytes.toBytes("course"), Bytes.toBytes("art")));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、代码写的比较粗糙,但是一些具体的内容反映出来了.

四、总结
抛砖引玉了,filte还有很多,如果细致,可以看看其他的filter类,这样是可以辅助我们在使用hbase进行查询的效率和功能的。
当然,对于前面说到的rowkey的设计也是十分重要的。复合的查询不仅能够缩短时间,也能加快查询的效率和速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值