Hbase提供的Filters有:
Ⅰ. Comparison Filters
Compartison Filters是基于比较的过滤器。定义如下:
CompareFilter(CompareOp valueCompareOp,WritableByteArrayComparable valueComparator)
该构造器有两个特定的参数,一个是比较运算符,另一个是比较器。
A、常见的比较运算符有:
LESS,LESS_OR_EQUAL,EQUAL,NOT_EQUAL,GREATER_OR_EQUAL,GREATER,NO_OP。前面几个运算符根据名字定义就能判断其意思,最后一个是NO_OP,表示排除任何数据。
B、常见的比较器有:其中NullComparator是判断给定的值是否为空或者非空。最后三个比较器只能搭配使用EQUAL,NOT_EQUAL比较运算符,返回0表示匹配,1表示不匹配。
BinaryComparator
BinaryPrefixComparator
NullComparator
BitComparator
RegexStringComparator
SubstringComparator
C、基于Comparison Filter的过滤器有好多种,比如:
1、RowFilter
2、FamilyFilter
3、QualifierFilter
4、ValueFilter
5、DependentColumnFilter
(1) RowFilter过滤器顾名思义就是根据RowKey来过滤数据。所以RowFilter中的比较运算符和比较器参数都是基于RowKey来比较的。比如如下Filter表示RowKey包含-4的数据。
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("-4"))。
(2) FamilyFilter过滤器跟RowFilter类似,不过FamilyFilter是基于ColumnFamily的比较。
QualifierFilter和ValueFilter过滤器也类似,分别是基于列和数值的比较。
(3) DependentColumnFilter过滤器稍微复杂一点。它可以说是timeStamp Filter和ValueFilter的结合。因为DependentColumnFilter需要指定一个参考列,然后获取跟改参考列有相同时间戳的所有列,再在此基础上获取满足ValueFilter的列值。构造函数如下:用户可以根据自己喜好省略valueFilter或者通过设置dropDependentColumn为true省略timestamp Filter。不过需要注意的是:此过滤器不能跟Scan中的Batch操作结合使用。
A、DependentColumnFilter(byte[] family, byte[] qualifier)
B、DependentColumnFilter(byte[] family, byte[] qualifier,boolean dropDependentColumn)
C、DependentColumnFilter(byte[] family, byte[] qualifier,boolean dropDependentColumn, CompareOp valueCompareOp,WritableByteArrayComparable valueComparator)
Ⅱ. Dedicated Filters
专有的一些过滤器,Hbase提供了许多个性化的专有过滤器。常见的Dedicated Filters有:
A、SingleColumnValueFilter
B、SingleColumnValueExcludeFilter
C、PrefixFilter
D、PageFilter
E、KeyOnlyFilter
F、FirstKeyOnlyFilter
G、InclusiveStopFilter
H、TimestampsFilter
I、ColumnCountGetFilter
J、ColumnPaginationFilter
K、ColumnPrefixFilter
L、RandomRowFilter
(1) 如果你想分页获取数据,可以通过PageFilter来完成。ColumnPaginationFilter跟PageFilter类似,只不过PageFilter是基于行的分页,而ColumnPaginationFilter是基于列的分页。如:
ColumnPaginationFilter(int limit, int offset),表示获取从offset列开始的连续limit列的数据。
(2) 如果只想获取每一行的第一列的值,那么FirstKeyOnlyFilter是不错的选择。此外,因为前面提到的Scan操作需要用户指定一个startRow和EndRow,其中这两个参数时左闭右开区间的。如果想EndRow也包含,可以通过InclusiveStopFilter来解决。如下:获取从Row5至Row10的数据
。不过因为Hbase是字典排序的,所以得到的结果中可能会包含Row51,Row52等这些行的数据。
Filter filter = new InclusiveStopFilter(Bytes.toBytes("row-9"));
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("row-5"));
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
(3) 如果想获取某个版本的所有数据。可以通过TimestampsFilter来设置,用户需要传入版本号。如下:
TimestampsFilter(List timestamps)
(4) PrefixFilter和ColumnPrefixFilter都是基于前缀的过滤器,不过PrefixFilter是基于行的前缀过滤,而后者是基于列的前缀过滤。
(5) RandomRowFilter是基于随机行的过滤器,用户需要指定一个在0到1之间的随机数,构造函数如下:如果chance大于1,则会返回所有行。如果小于0,则过滤掉所有行。
RandomRowFilter(float chance)
Ⅲ. Decorating Filters
Decorating Filters称为装饰型的过滤器。它的作用是为其他过滤器返回的结果提供一些附加的校验操作。常见的Decorating Filters有:
A、SkipFilter
B、WhileMatchFilter
(1) SkipFilter包装了其它的过滤器,只要被包装的过滤器返回的结果中有一行的某一列或者某个KeyValue被过滤掉了,那么SkipFilter会将该列或者KeyValue所处的整行全部过滤。被包装的过滤器必须实现filterKeyValue()方法。因为SkipFilter会依靠filterKeyValue()返回的结果进行附加的处理。比如:
Filter filter = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,new BinaryComparator(Bytes.toBytes("val-1")));
上面这样一个filter,表示返回的结果中值不能等于val-1,这样值为val-1的那个列就不会展示,但该行的其他列只要满足值不等于val-1都会返回。
不过一旦使用了SkipFilter,如:Filter filter2 = new SkipFilter(filter);只要存在某一行中的某个列的值等于val-1,那么该行的所有数据都不会返回。
(2) WhileMatchFilter跟SkipFilter类似,不过区别之处在于WhileMatchFilter一旦找到某一行中的某些列值或者KeyValue不满足条件,那么整个Scan操作就会被终止。SkipFilter只是会将此行过滤,不作为返回值,但Scan操作会继续。
Ⅳ. Custom Filters
如果想实现自定义的Filter,可以实现Filter接口或者扩展FilterBase类。FilterBase类提供了基本的Filter实现。
如果用户想在一次检索数据的过程中使用多个Filter,那么可以使用FilterList特性。其构造函数如下:
FilterList(List rowFilters)
FilterList(Operator operator)
FilterList(Operator operator, List rowFilters)
其参数operator其枚举值有两个:MUST_PASS_ALL(表示返回的结果集数据必须通过所有过滤器的过滤),MUST_PASS_ONE(表示返回的结果集数据只要通过了其中一个过滤器就行)。