内容简介
一、专用过滤器
0.专用过滤器基本概念
- 在一文HBase学习之路(五):理解过滤器的概念及比较过滤器的使用中已经介绍了HBase中过滤器的基本概念了,并且详细介绍HBase的第一类过滤器,比较过滤器,这一类过滤器继承了CompareFilter类,需要传入比较运算符和比较器来使用。专用过滤器是HBase提供的第二类过滤器,这类过滤器继承了FilterBase类,同时适用于更特定的场景,其中的一些过滤器只能做筛选,因此只适用于扫描操作。
1.单列值过滤器
- 单列值过滤器(SingleColumnValueFilter)适用于以下场景:用一列值的比较条件来绝定是否一行的数据都被过滤。因此首先要设置待检查的列,然后设置列值及比较条件,具体构造方法如下:
SingleColumnValueFilter(byte[] family,byte[] qualifier,CompareOp compareOp,byte[] value)
SingleColumnValueFilter(byte[] family,byte[] qualifier,CompareOp compareOp,WritableByteArrayComparable comparator)
第一个构造方法内部会创建一个BinaryComparator比较器,因此传入一个value即可进行比较,即第一个构造方法已经限制只能与特定的列值进行比较操作;第二个构造方法则更加的通用,传进来一个比较器,因此可以进行多种操作,尽管SingleColumnValueFilter并没有继承CompareFilter类,但是其任然使用了CompareOp和WritableByteArrayComparable 参数,有关这两个参数的详细介绍请看 HBase学习之路(五):理解过滤器的概念及比较过滤器的使用,这里就不介绍了。
其次该过滤器提供了一些方法进行微调过滤行为:
void setFilterMissing(boolean filterMissing)
void setLatestVersionOnly(boolean latestVersionOnly)
第一个方法决定了当参考列不符合条件时是否包含在处理结果中即是否被过滤,默认是true;第二个方法是决定扫描的版本,如果为true则只扫描最新的版本,如果为false则会扫描所有的版本,默认是true;
现在假设我想要把特定列下包含子串"xiao-ban-zhu"的列所对应行过滤掉,核心代码如下:// 创建扫描器实例 Scan scan = new Scan(); // 创建单列值过滤器,设置列族和参考列,传入比较运算符和比较器 SingleColumnValueFilter filter = new SingleColumnValueFilter( Bytes.toBytes("column1"), Bytes.toBytes("col-1"), CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("xiao-ban-zhu")); // 设置如果扫描列没有符合参考列的条件,则被过滤掉 filter.setFilterMissing(true); // 为扫描器设置过滤器 scan.setFilter(filter); // 进行扫描 ResultScanner scanner = table.getScanner(scan); // 遍历结果 for(Result result:scanner){ System.out.println(result); } scanner.close();
2.单列排除过滤器
- 单列排除过滤器(SingleColumnValueExcludeFilter)继承自单列值过滤器(SingleColumnValueFilter),经过扩展后与单列值过滤器略有不同:参考列不会被包含在结果中,即用法与单列值过滤器一致,只是在返回值Result集合中不会获得作为检查目标的参考列。
3.前缀过滤器
- 前缀过滤器(PrefixFilter)适用于以下场景:输入一个前缀,所有行健前缀与参考前缀匹配的行都会被返回到客户端。它的构造方法是:
public PrefixFilter(byte[] prefix)
假设我现在想查询,所有行键前缀是"xiao-ban-zhu"的行,其核心代码是:// 创建扫描器实例 Scan scan = new Scan(); // 创建前缀过滤器,传入参考前缀 Filter filter = new PrefixFilter(Bytes.toBytes("xiao-ban-zhu")); // 为扫描器设置过滤器 scan.setFilter(filter)