获取和扫描实例可以选择配置应用于 RegionServer 的过滤器。
过滤器可能会造成混淆,因为有许多不同的类型,最好通过了解过滤器功能组来处理它们。
结构过滤器包含其他过滤器
FilterList 表示在过滤器之间具有FilterList.Operator.MUST_PASS_ALL
或FilterList.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);
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);
作为 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
是用于进行值过滤的条件。
但如果查询比本书更复杂,那么请根据具体情况做出不错的选择。
Filter 包中有几个 Comparator 类值得特别提及。这些比较器与其他滤波器一起使用,例如 SingleColumnValueFilter 。
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。
SubstringComparator 可用于确定某个值是否存在给定的子字符串。比较不区分大小写。
SubstringComparator comp = new SubstringComparator("y val"); // looking for 'my value'
SingleColumnValueFilter filter = new SingleColumnValueFilter(
cf,
column,
CompareOperaor.EQUAL,
comp
);
scan.setFilter(filter);
参见 BinaryComparator 。
由于 HBase 在内部将数据存储为 KeyValue 对,因此 KeyValue 元数据过滤器会评估行的键的存在(即 ColumnFamily:Column 限定符),而不是上一节的值。
FamilyFilter 可用于过滤 ColumnFamily。在扫描中选择 ColumnFamilies 通常比使用 Filter 执行它更好。
QualifierFilter 可用于根据列(又称限定符)名称进行过滤。
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();
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();
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 中引入
在扫描行选择时使用 startRow / stopRow 方法通常更好一点,但也可以使用 RowFilter 。
这主要用于 rowcount 作业。见 FirstKeyOnlyFilter 。