HBase过滤器

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();

3.5,ColumnRangeFilter
可以进行高雄列名内部扫描。HBase-0.92版本引入该功能。下面的实例扫描所有在”b-100"和“d-999”之间的列:

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,DependentColumnFilter
该过滤器有两个参数:Column Family和Qualifier,该过滤器试图找到该列所在的每一行,并返回该行具有相同时间戳的全部键值对。如果某一行不包含指定的列,则不返回改行的任何键值对。该过滤器还有一个可选的布尔参数-----如果为TRUE,丛属的列不返回。该过滤器还有两个可选的参数------一个比较操作符和一个值比较器,然后就是必须考虑时间戳,具体的实例如下:

Filter 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,行健过滤器
4,1,RowFilter
一般来将,执行Scan时使用startRow和stopRow方式比较好,而RowFilter过滤器也可以完成对某一行的过滤。实例如下:
Scan scan = new Scan();
scan.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("c0"));
Filter filter = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row-1")));
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for(Result rt : scanner)
{
System.out.println(res);
}
scanner.close();
4.2,RandomRowFilter
是一个随机选择一行的过滤器。其构造函数为RandomRowFilter(float chance),参数chance是一个浮点值,介于0.0到1.0之间。
5,功能过滤器
5.1,PageFilter
用于按行分页,实例如下:
Filter filter = new PageFilter(15);
int totalRows = 0;
byte[] lastRow = null;
while(true){
Scan scan = new Scan();
scan.setFilter(filter);
if(lastRow!=null){
byte[] startRow = Bytes.add(lastRow,POSTIFX);
System.out.println("Start row:"+Bytes.toStringBinary(startRow));
scan.setStartRow(startRow);
}
ResultScanner scanner = table,getScanner(scan);
int localRows = 0;
Result rt;
whilt((rt = scanner.next())!=null){
System.out.println(localRows++  +result);
totalRows++;
lastRow = rt.getRow();
}
scanner.close();
if(localRows ==0)break;
}
System.out.println(‘total row: " +totalRows);
5.2,FirstKeyOnlyFilter 只差每个行健的第一个键值对,用于在统计技术的时候提高效率。
5.3,KeyOnlyFilter值查有”键“元数据信息,不显示值,Keith提升扫描的效率。
5.4,InclusiveStopFilter常规Scan包含startrow但是不包含stoprow,如果使用InclusiveStopFilter过滤器可以包含stop-row。
5.5,ColumnPaginationFilter是按列分页过滤器,针对列数很多的情况使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值