1,比较器
比较器是过滤器的核心组成之一,用于处理具体的比较逻辑,例如字节级的比较、字符串的比较等。
1.1,RegexStringComparator
支持正则表达式(与Java的正则表达式相同,参考http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html,下面是使用的实例:
RegexStringComparator comp = new RegexStringComparator("my.");
SingleColumnValueFilter filter = new SinggleColumnValueFilter(cf,column,CompareOp.EQUAL,comp);
scan.setFilter(filter);
1.2,SubstringComparator
用于检测一个子串是否存在于值中,不区分大小写,具体使用实例如下:
SubstringComparator comp=new SubstringComparator("y val")//查找‘y val'的字符串
SingleColumnValueFilter Filter = newSingleColumnValueFilter(cf,column,CompareOp.EQUAL,comp);
scan.setFilter(Filter);
1.3,BinaryPrefixComparator
是前缀二进制比较器。与二进制比较器不同的是,值比较前缀是否相同。具体使用示例如下:
filter(true,CompareFilter.Compare.EQUAL,new BinaryPrefixComparator(Bytes.toBytes("val-5")));
1.4,BinaryComparator
是二进制比较器,用于按照字典顺序比较Byte数据值,如实例所示:
Filter filter1 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,new BinaryComparator(Bytes.toBytes("val-0")));
Scan scan = new Scan();
scan.setFilter(filter1);
ResultScanner scanner1 = table.getScanner(scan);
for(Reuslt rt: scanner1){
for(KeyValue kv : rt){
System.out.Println("KV: "+kv+", value:"+Bytes.toString(kv.getValue()));
}
}
scanner1.close;
2,列值过滤器
2.1,SingleColumnValueFilter
用于测试列支相等(compareOp.EQUAL)、不等、范围等情况。下面检测列支和字符串'my value'相等的查询部分代码:
SingleColumnValueFilter Filter= new SingleColumnValueFilter(cf,column,CompareOp.EQUAL,Bytes.toBytes("my value"));
scan,setFilter(filter);
2.2,SingleColumnValueExcludeFilter
用于单列值过滤,但不查询出该列的值,实例代码如下:
Filter exclude = new SingleColumnValueExcludeFilter(Bytes.toBytes("info"),Bytes.toBytes("age"),CompareOp.EQUAL,Bytes.toBytes("24"));
scan.setFilter(exclude);
3,键值元数据过滤器
3.1,FamilyFilter
用于过滤列族,但通常会在使用scan过程中通过设定某些列族来实现该功能,而不是直接使用FamliyFilter过滤器。
Filter filter = new FamilyFilter(CompareFilter.CompareOp.LESS,new BinaryComparator(Bytes.toBytes("cf3")));
Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for(Result rt ; scanner){
System.out.println(rt);
}
scanner.close();
3.2,QualifierFilter
用于列名过滤:
Filter filter = new QualifierFilter(CompareFilter.CompareOp.LESS,new BinaryComparator(Bytes.toBytes("cf3")));
Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for(Result rt ; scanner){
System.out.println(rt);
}
scanner.close();
3.3,ColumnPrefixFilter用于列名前缀过滤,即包含某个前缀的所有列名。下面以查找“abc"为前缀的所有列名实例:
HTableInfterface t = ....
byte[] row =...;
byte[] family = ...;
byte[] prefix = Bytes.toBytes("abc");
Scan scan = new Scan(row,row);
scan.addFamily(family);
Filter f = new ColumnPrefixFilter(prefix);
scan.setFilter(f);
scan.setBatch(10);
ResultScanner rs = t.getScanner(scan);
for(Result r = rs.next();r!=null;r = rs.next()){
for(KeyValue kv : r.raw()){
....}
}
rs.close();
3.4,MultipleColumnPrefixFilter
与ColumnPrefixFilter行为类似,但可以指向多个前缀,下面以指定”abc“和”xyz“为例子:
HTableInfterface t = ....
byte[] row =...;
byte[] family = ...;
byte[][] prefix = new byte[][] {Bytes.toBytes("abc"),Bytes.toBytes("xyz")};
Scan scan = new Scan(row,row);
scan.addFamily(family);
Filter f = new MultipleColumnPrefixFilter(prefix);
scan.setFilter(f);
scan.setBatch(10);
ResultScanner rs = t.getScanner(scan);
for(Result r = rs.next();r!=null;r = rs.next()){
for(KeyValue kv : r.raw()){
....}
}
rs.close();
HTableInfterface t = ....
byte[] row =...;
byte[] family = ...;
byte[] startcolumn = Bytes.toBytes("b-100");
byte[] endcolumn = Byter.toBytes("d-999");
Scan scan = new Scan(row,row);
scan.addFamily(family);
Filter f = new ColumnRangeFilter(startcolumn,true,endcolumn,true);
scan.setFilter(f);
scan.setBatch(10); //设置批量值,该值作用与列
ResultScanner rs = t.getScanner(scan);
for(Result r = rs.next();r!=null;r = rs.next()){
for(KeyValue kv : r.raw()){
....}
}
rs.close();
3.6,DependentColumnFilterFilter f = new DependentColumnFilter(Bytes.toBytes("cf1"),Bytes.toBytes("c5"),drop);
Scan scan = new Scan();
scan.setFilter(f);
ResultScanner rs = t.getScanner(scan);
for(Result r = rs.next();r!=null;r = rs.next()){
for(KeyValue kv : r.raw()){
....}
}
rs.close();
4,行健过滤器System.out.println(res);