HBase查询(3)---Decorating Filters装饰性过滤器

3.1  SkipFilter

这个过滤器只作用到ValueFilter上。ValueFilter会返回所有满足条件的row及对应的列。而加上SkipFilter以后。会发现如果某一行的某一列不符合条件,则这一行全部不返回了。

package filter;

import java.io.IOException;

import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.SkipFilter;
import org.apache.hadoop.hbase.filter.ValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

public class SkipFilterExample extends FilterExampleBase {

	public static void main(String[] args) throws IOException {
		new SkipFilterExample().doMain();
	}

	public void testFilter() throws IOException {
		Filter filter1 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL, 
                         new BinaryComparator(Bytes.toBytes("c1a")));
		Scan scan = new Scan();
		scan.setFilter(filter1);
		ResultScanner scanner1 = table.getScanner(scan);
		System.out.println("Results of scan #1:");
		int n = 0;
		for (Result result : scanner1) {
			for (KeyValue kv : result.raw()) {
				System.out.println("KV: " + kv + ", Value: " + Bytes.toString(kv.getValue()));
				n++;
			}
		}
		scanner1.close();
		System.out.println("Total KeyValue count for scan #1: " + n);

		
		Filter filter2 = new SkipFilter(filter1);
		scan.setFilter(filter2);
		ResultScanner scanner2 = table.getScanner(scan);
		n = 0;
		System.out.println("Results of scan #2:");
		for (Result result : scanner2) {
			for (KeyValue kv : result.raw()) {
				System.out.println("KV: " + kv + ", Value: " + Bytes.toString(kv.getValue()));
				n++;
			}
		}
		scanner2.close();
		System.out.println("Total KeyValue count for scan #2: " + n);
	}

}

结果:
start create table......
test is exist delete!!!
create table over......
start insert......
end insert......


-----------------findAll() start-------------
{rowkey:r1 c1:a=r1c1a c1:b=r1c1b c2:a=r1c2a c2:b=r1c2b}
{rowkey:r2 c1:a=r2c1a c2:b=r2c2b}
{rowkey:r3 c1:a=c1a c1:b=r3c1b c2:a=r3c2b c2:b=r3c2b}
{rowkey:r4 c1:a=c1a c1:b=r4c1b c2:a=r4c2b c2:b=r4c2b}
-----------------findAll() end-------------


Results of scan #1:
KV: r1/c1:a/1378780212041/Put/vlen=5/ts=0, Value: r1c1a
KV: r1/c1:b/1378780212041/Put/vlen=5/ts=0, Value: r1c1b
KV: r1/c2:a/1378780212041/Put/vlen=5/ts=0, Value: r1c2a
KV: r1/c2:b/1378780212041/Put/vlen=5/ts=0, Value: r1c2b
KV: r2/c1:a/1378780212056/Put/vlen=5/ts=0, Value: r2c1a
KV: r2/c2:b/1378780212056/Put/vlen=5/ts=0, Value: r2c2b
KV: r3/c1:b/1378780212063/Put/vlen=5/ts=0, Value: r3c1b
KV: r3/c2:a/1378780212063/Put/vlen=5/ts=0, Value: r3c2b
KV: r3/c2:b/1378780212063/Put/vlen=5/ts=0, Value: r3c2b
KV: r4/c1:b/1378780212070/Put/vlen=5/ts=0, Value: r4c1b
KV: r4/c2:a/1378780212070/Put/vlen=5/ts=0, Value: r4c2b
KV: r4/c2:b/1378780212070/Put/vlen=5/ts=0, Value: r4c2b
Total KeyValue count for scan #1: 12
Results of scan #2:
KV: r1/c1:a/1378780212041/Put/vlen=5/ts=0, Value: r1c1a
KV: r1/c1:b/1378780212041/Put/vlen=5/ts=0, Value: r1c1b
KV: r1/c2:a/1378780212041/Put/vlen=5/ts=0, Value: r1c2a
KV: r1/c2:b/1378780212041/Put/vlen=5/ts=0, Value: r1c2b
KV: r2/c1:a/1378780212056/Put/vlen=5/ts=0, Value: r2c1a
KV: r2/c2:b/1378780212056/Put/vlen=5/ts=0, Value: r2c2b
Total KeyValue count for scan #2: 6

3.2 WhileMatchFilter

其构造函数如下,功能:检索到第一个不满足filter1的cell就终止,返回检索的结果

public WhileMatchFilter(Filter filter1)

示例:

package filter;

import java.io.IOException;

import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.ValueFilter;
import org.apache.hadoop.hbase.filter.WhileMatchFilter;
import org.apache.hadoop.hbase.util.Bytes;

public class WhileMatchFilterExample extends FilterExampleBase {

	public static void main(String[] args) throws IOException {
		new WhileMatchFilterExample().doMain();
	}

	public void testFilter() throws IOException {
		Filter filter1 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL, 
                     new BinaryComparator(Bytes.toBytes("r3c1b")));
		Filter whilematchFilter = new WhileMatchFilter(filter1);
		Scan scan = new Scan();
		scan.setFilter(whilematchFilter);
		ResultScanner scanner = table.getScanner(scan);
		showScanner(scanner);
		scanner.close();
	}
}

结果:
start create table......
test is exist delete!!!
create table over......
start insert......
end insert......


-----------------findAll() start-------------
{rowkey:r1 c1:a=r1c1a c1:b=r1c1b c2:a=r1c2a c2:b=r1c2b}
{rowkey:r2 c1:a=r2c1a c2:b=r2c2b}
{rowkey:r3 c1:a=c1a c1:b=r3c1b c2:a=r3c2b c2:b=r3c2b}
{rowkey:r4 c1:a=c1a c1:b=r4c1b c2:a=r4c2b c2:b=r4c2b}
-----------------findAll() end-------------


{rowkey:r1 c1:a=r1c1a c1:b=r1c1b c2:a=r1c2a c2:b=r1c2b}
{rowkey:r2 c1:a=r2c1a c2:b=r2c2b}
{rowkey:r3 c1:a=c1a}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值