Get和Scan实例可以选择性地配置应用有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 其他
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