以下内容参考自《HBase权威指南》 —— 代志远 刘佳 蒋杰 译
CompareFilter中的比较运算符
比较器(基于CompareFilter的过滤器提供的)
BinaryComparator,使用Bytes.compareTo()比较当前值与阈值
BinaryPrefixComparator,使用Bytes.compareTo()进行匹配,但是是从左端开始前缀匹配
NullComparator,不做匹配,只判断当前值是不是null
RegexStringComparator,根据一个正则表达式,在实例化这个比较器的时候去匹配表中的数据
SubstringComparator,把阈值和表中数据当做String实例,同时通过contains()操作匹配字符串
注意:最后两个比较器只能与EQUAL或NOT EQUALS使用
一、比较过滤器
1、行过滤器
行过滤器基于行键来过滤数据。
使用多种比较运算符来返回条件的行键,同时会过滤不符合条件的行键。
结果
2、列族过滤器
基于列族来过滤数据。
通过使用不同组合的运算符和比较器,用户可以在列族一级筛选所需的数据。
结果
3、列名过滤器
筛选特定的列
4、值过滤器
筛选某个特定值的单元格
结果
二、专用过滤器
1、单列值过滤器
用一列的值决定是否一行数据被过滤,首先设定待检查的列,然后设置待检查的列的对应值。
注意两个属性:filterIfMissing、LatestVersionOnly
前者决定了当参考列不存在时如何处理这一行。默认的这一行是被包含在结果中的,可以设置setFilterIfMissing(true)来过滤这些行,即所有不包含参考列的行后被过滤掉了。
后者默认为true,此时过滤器只检查参考列的最新版本,setLatestVersionOnly(false)之后会检查所有的版本。
结果
2、单列排除过滤器
该过滤器继承自单列值过滤器,经过扩展后提供一种略微不同的语意:参考列不被包含到结果中。
理解为:在单列值过滤器的基础上,排除掉满足条件的列,得到的结果就是单列排除过滤器得到的结果
结果(建议对比于上一个过滤器的结果)
3、前缀过滤器
在构造器中传入一个前缀,所有与前缀匹配的行都会被返回到客户端
public PrefixFilter(byte[] prefix)
扫描操作以字典序查找,当遇到比前缀大的行时,扫描操作就结束了。通过与起始行配合使用,过滤器的扫描性能大大提高,原因是当它发现后面的行不符合要求时会全部跳过。
结果:
三、FilterList
可以提供多个过滤器的共同限制,
三种构造器:
FilterList(List<Filter> rowFilters)
FilterList(Operator operator)
FilterList(Operator operator, List<Filter> rowFilters)
参数rowFilter以列表的形式组合过滤器参数operator决定了组合它们的结果。
操作 | 描述 |
MUST_PASS_ALL(默认) | 当所有过滤器都允许包含这个值时,这个值才会被包含在结果中,也就是说没有过滤器会忽略这个值 |
MUST_PASS_ONE | 只要有一个过滤器允许包括这个值,那这个值就会包含在结果中 |
虽然每个FilterList只能拥有一个操作符,但是FilterList可以包含FilterList,这样可以构造多级的过滤器。
可以通过控制List中过滤器的顺序来进一步精确地控制过滤器的执行顺序。
即在默认操作符下,可以将某个过滤器(能够过滤掉大部分行)放到开始位置,从而加快查询效率