9.4 客户端请求过的滤器

GetScan实例可以选择性地配置应用有RegionServer上的过滤器(filters)。过滤器是比较容易使人迷糊的工具,因为有许多不同类型的过滤器,最好通过了解过滤器的功能来学习它们。

9.4.1 结构

结构过滤器包含其他过滤器。

9.4.1.1 FilterList

FilterList表示一个过滤器列表,这些过滤器之间存在FilterList.Operator.MUST_PASS_ALL或FilterList.Operator.MUST_PASS_ONE关系。以下是一个关于过滤器之间的‘or’关系的示例(检测同一属性的值为‘my value’或‘my other value’):

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);
SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
	cf,
	column,
	CompareOp.EQUAL,
	Bytes.toBytes("my value")
	);
list.add(filter1);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
	cf,
	column,
	CompareOp.EQUAL,
	Bytes.toBytes("my other value")
	);
list.add(filter2);
scan.setFilter(list);

9.4.2 列的值

9.4.2.1 SingleColumnValueFilter

SingleColumnValueFilter可用于检测列的值的相等(CompareOp.EQUAL)、不等(CompareOp.NOT_EQUAL)、范围(如CompareOp.GREATER)等。例如:

SingleColumnValueFilter filter = new SingleColumnValueFilter(
	cf,
	column,
	CompareOp.EQUAL,
	Bytes.toBytes("my value")
	);
scan.setFilter(filter);

9.4.3 列值比较器

过滤器包中有几个比较器的类需要特别注意,这些比较器与其他过滤器协和工作,如SingleColumnValueFilter。

9.4.3.1 RegexStringComparator

RegexStringComparator支持在进行值匹配时使用正则表达式

RegexStringComparator comp = new RegexStringComparator("my.");   // any value that starts with 'my'
SingleColumnValueFilter filter = new SingleColumnValueFilter(
	cf,
	column,
	CompareOp.EQUAL,
	comp
	);
scan.setFilter(filter);

关于正则表达式可以参考 supported RegEx patterns in Java

9.4.3.2 SubstringComparator

SubstringComparator可以用于确定给定子字符串是否在值中,该比较区分大小写。

SubstringComparator comp = new SubstringComparator("y val");   // looking for 'my value'
SingleColumnValueFilter filter = new SingleColumnValueFilter(
	cf,
	column,
	CompareOp.EQUAL,
	comp
	);
scan.setFilter(filter);

9.4.3.3 其他

 BinaryPrefixComparator.

 BinaryComparator.

9.4.4 键值元数据

由于HBase内部使用键值对存储数据,所以键值元数据过滤器可以用于鉴别某个行的键是否存在。

9.4.4.1 FamilyFilter

FamilyFilter可用于筛选ColumnFamily,在使用Scan时使用该筛选是非常推荐的。

9.4.4.2 QualifierFilter

QualifierFilter可基于列名(Qualifier)进行筛选。

9.4.4.3 ColumnPrefixFilter

ColumnPrefixFilter也是基于列名(Qualifier)筛选的。ColumnPrefixFilter将指向每个行及调用的列族中第一个匹配前缀的位置。它可以用于高效率地搜索宽行的列的子集。

注意:同一个列限定符可用在不同的列族中,这个过滤器将返回所有匹配的列。

例如:搜索所有以‘abc'开题的列

HTableInterface t = ...;
byte[] row = ...;
byte[] family = ...;
byte[] prefix = Bytes.toBytes("abc");
Scan scan = new Scan(row, row); // (optional) limit to one row
scan.addFamily(family); // (optional) limit to one family
Filter f = new ColumnPrefixFilter(prefix);
scan.setFilter(f);
scan.setBatch(10); // set this if there could be many columns returned
ResultScanner rs = t.getScanner(scan);
for (Result r = rs.next(); r != null; r = rs.next()) {
  for (KeyValue kv : r.raw()) {
    // each kv represents a column
  }
}
rs.close();

9.4.4.4 MultipleColumnPrefixFilter

MultipleColumnPrefixFilter与ColumnPrefixFilter功能相似,但允许指定多个前缀。与ColumnPrefixFilter一样,MultipleColumnPrefixFilter可以高效低定位与最小前缀匹配的第一个列,及匹配各个前缀之间的值的列。它可用于在宽行中搜索不连续的列的集合。

例如:搜索所有以’abc'或‘xyz'开题的列

HTableInterface t = ...;
byte[] row = ...;
byte[] family = ...;
byte[][] prefixes = new byte[][] {Bytes.toBytes("abc"), Bytes.toBytes("xyz")};
Scan scan = new Scan(row, row); // (optional) limit to one row
scan.addFamily(family); // (optional) limit to one family
Filter f = new MultipleColumnPrefixFilter(prefixes);
scan.setFilter(f);
scan.setBatch(10); // set this if there could be many columns returned
ResultScanner rs = t.getScanner(scan);
for (Result r = rs.next(); r != null; r = rs.next()) {
  for (KeyValue kv : r.raw()) {
    // each kv represents a column
  }
}
rs.close();

9.4.4.5 ColumnRangeFilter

ColumnRangeFilter可用于实现高效的行内搜索。ColumnRangeFilter将定位相关列族中第一个匹配的列。

例如:搜索行和列族中’bbbb‘和’bbdd‘之间的列,即['bbbb', 'bbdd']

HTableInterface t = ...;
byte[] row = ...;
byte[] family = ...;
byte[] startColumn = Bytes.toBytes("bbbb");
byte[] endColumn = Bytes.toBytes("bbdd");
Scan scan = new Scan(row, row); // (optional) limit to one row
scan.addFamily(family); // (optional) limit to one family
Filter f = new ColumnRangeFilter(startColumn, true, endColumn, true);
scan.setFilter(f);
scan.setBatch(10); // set this if there could be many columns returned
ResultScanner rs = t.getScanner(scan);
for (Result r = rs.next(); r != null; r = rs.next()) {
  for (KeyValue kv : r.raw()) {
    // each kv represents a column
  }
}
rs.close();

9.4.5 行键

9.4.5.1 RowFilter

在执行Scan时刻利用RowFilter指定行的搜索范围,即[start, end)。


http://hbase.apache.org/book/client.filter.html


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值