获取扫描实例可以选择配置应用于 RegionServer 的过滤器

过滤器可能会造成混淆,因为有许多不同的类型,最好通过了解过滤器功能组来处理它们。

69.1。结构

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

69.1.1。 FilterList

FilterList 表示在过滤器之间具有FilterList.Operator.MUST_PASS_ALLFilterList.Operator.MUST_PASS_ONE关系的过滤器列表。以下示例显示了两个过滤器之间的“或”(在同一属性上检查“我的值”或“我的其他值”)。

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

69.2。列值

69.2.1。 SingleColumnValueFilter

SingleColumnValueFilter(参见: https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.html )可用于测试等值的列值(CompareOperaor.EQUAL ),不等式(CompareOperaor.NOT_EQUAL)或范围(例如,CompareOperaor.GREATER)。以下是测试列与 String 值“my value”的等效性的示例...

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

69.2.2。 ColumnValueFilter

作为 SingleColumnValueFilter 的补充,在 HBase-2.0.0 版本中引入,ColumnValueFilter 仅获取匹配的单元格,而 SingleColumnValueFilter 获取匹配的单元格所属的整个行(具有其他列和值)。 ColumnValueFilter 的构造函数的参数与 SingleColumnValueFilter 相同。

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

注意。对于简单查询,例如“等于系列:限定符:值”,我们强烈建议使用以下方法,而不是使用 SingleColumnValueFilter 或 ColumnValueFilter:

Scan scan = new Scan();
scan.addColumn(Bytes.toBytes("family"), Bytes.toBytes("qualifier"));
ValueFilter vf = new ValueFilter(CompareOperator.EQUAL,
  new BinaryComparator(Bytes.toBytes("value")));
scan.setFilter(vf);
... 

此扫描将限制到指定的列'family:qualifier',避免扫描不相关的族和列,具有更好的性能,ValueFilter是用于进行值过滤的条件。

但如果查询比本书更复杂,那么请根据具体情况做出不错的选择。

69.3。列值比较器

Filter 包中有几个 Comparator 类值得特别提及。这些比较器与其他滤波器一起使用,例如 SingleColumnValueFilter

69.3.1。 RegexStringComparator

RegexStringComparator 支持用于值比较的正则表达式。

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

有关 Java 中支持的支持的 RegEx 模式,请参阅 Oracle JavaDoc。

69.3.2。 SubstringComparator

SubstringComparator 可用于确定某个值是否存在给定的子字符串。比较不区分大小写。

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

69.3.3。 BinaryPrefixComparator

参见 BinaryPrefixComparator

69.3.4。 BinaryComparator

参见 BinaryComparator

69.4。 KeyValue 元数据

由于 HBase 在内部将数据存储为 KeyValue 对,因此 KeyValue 元数据过滤器会评估行的键的存在(即 ColumnFamily:Column 限定符),而不是上一节的值。

69.4.1。 FamilyFilter

FamilyFilter 可用于过滤 ColumnFamily。在扫描中选择 ColumnFamilies 通常比使用 Filter 执行它更好。

69.4.2。 QualifierFilter

QualifierFilter 可用于根据列(又称限定符)名称进行过滤。

69.4.3。 ColumnPrefixFilter

ColumnPrefixFilter 可用于根据 Column(又称限定符)名称的前导部分进行过滤。

ColumnPrefixFilter 向前搜索与每行中的前缀匹配的第一列以及每个涉及的列族。它可用于在非常宽的行中有效地获取列的子集。

注意:可以在不同的列族中使用相同的列限定符。此过滤器返回所有匹配的列。

示例:查找以“abc”开头的行和族中的所有列

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

69.4.4。 MultipleColumnPrefixFilter

MultipleColumnPrefixFilter 的行为与 ColumnPrefixFilter 类似,但允许指定多个前缀。

与 ColumnPrefixFilter 一样,MultipleColumnPrefixFilter 有效地向前搜索与最低前缀匹配的第一列,并且还在前缀之间寻找过去的列范围。它可用于从非常宽的行中有效地获得不连续的列集。

示例:查找以“abc”或“xyz”开头的行和族中的所有列

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

69.4.5。 ColumnRangeFilter

ColumnRangeFilter 允许有效的行内扫描。

ColumnRangeFilter 可以提前查找每个相关列族的第一个匹配列。它可用于有效地获得非常宽的行的“切片”。即你连续有一百万列,但你只想查看列 bbbb-bbdd。

Note: The same column qualifier can be used in different column families. This filter returns all matching columns.

示例:在“bbbb”(包括)和“bbdd”(包括)之间查找行和族中的所有列

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

注意:在 HBase 0.92 中引入

69.5。 RowKey

69.5.1。的 RowFilter

在扫描行选择时使用 startRow / stopRow 方法通常更好一点,但也可以使用 RowFilter

69.6。效用

69.6.1。 FirstKeyOnlyFilter

这主要用于 rowcount 作业。见 FirstKeyOnlyFilter