学习HBase一段时间后,我认为HBase中比较常用,同时也是必须掌握的两个API是Scan和Filter。如下是我的理解:
1.Scan ---- 扫描类
作用:用来对一个指定Table进行按行扫描,从而得到属于[起始行健,终止行健)的扫描结果
使用场合:单纯的扫描用途;用于MapReduce计算的输入
2.Filter --- 过滤类
作用:用来提前在Server端,对要返回的数据,按照定义好的要求进行过滤;从而降低从Server到Client的数据量,进而降低对网络IO的影响
使用场合:与Scan配合使用
种类:有HBase定义好的几种Filter,也有提供基于FilterBase进行自定义过滤器的方法。特别要注意的是:Filter的作用是过滤掉东西,而不是保留东西。因此其返回true,则意味着成功过滤掉了;返回false,表示没有被过滤掉。
3.举例:
HTable t = new HTable(conf, "twits");
Scan s = new Scan(startRowkey, endRowkey); //构造Scan对象,此对象会返回[startRowkey,endRowkey)范围的记录。特别的,HBase里面的行健是按照字典顺序排列的(可以和lucene里面的索引的顺序进行类比吧?);而且startRowkey和endRowkey也无须真实存在,HBase会自动找到最靠近其的实际rowkey作为边界
//当然,这里还可以加入过滤器,比如:s.setFilter(具体的Filter对象实例);
ResultScanner rs = t.getScanner(s); //获得扫描后的结果集
for(Result r:rs) { //每一行的扫描结果,记录在Result中;
for(KeyValue kv:r.raw()) {//这里就体现了HBase中的存储实际上是 嵌套的MAP 的含义了。
System.out.println("Rowkey is " + Bytes.toString(kv.getRow()));
System.out.println("family is " + Bytes.toString(kv.getFamily()));
System.out.println("qualify is " + Bytes.toString(kv.getQualifier()));
System.out.println("timestamp is " + kv.getTimestamp());
System.out.println("value is " + Bytes.toString(kv.getValue()));
}
}