hbase学习笔记6-过滤器
Hbase在操作数据中的基本的API,包括增删查。增删都是相对简单的操作,与传统的RDBMS相比,这里的查询操作略显苍白,只能根据特定的主键查询(Get)或者根据主键的一个范围来查询(Scan)。Hbase提供了更加高级的过滤器来查询,当然还有另外一些高级的模块,我们将在这一篇里看到。
一、过滤器(Filter)
基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter。Filter可以根据簇、列、版本等更多的条件来对数据进行过滤,基于Hbase本身提供的三维有序(主键有序、列有序、版本有序),这些Filter可以高效的完成查询过滤的任务。带有Filter条件的RPC查询请求会把Filter分发到各个RegionServer,是一个服务器端(Server-side)的过滤器,这样也可以降低网络传输的压力。
要完成一个过滤的操作,至少需要两个参数。一个是抽象的操作符,Hbase提供了枚举类型的变量来表示这些抽象的操作符:LESS/LESS_OR_EQUAL/EQUAL/NOT_EUQAL等;另外一个就是具体的比较器(Comparator),代表具体的比较逻辑,如果可以提高字节级的比较、字符串级的比较等。有了这两个参数,我们就可以清晰的定义筛选的条件,过滤数据。
CompareFilter(CompareOp compareOp, WritableByteArrayComparable valueComparator)
CompareFilter是高层的抽象类,下面我们将看到它的实现类和实现类代表的各种过滤条件。这里实现类实际上代表的是参数中的过滤器过滤的内容,可以使主键、簇名、列值等,这就是由CompareFilter决定了。
行过滤器(RowFilter)
行过滤器的比较对象是行主键
Scan scan = new Scan();
Filter filter1 = new RowFilter(CompareFIlter.CompareOp.LESS_OR_EUQAL, new BinaryComparator(Bytes.toBytes("hello")));
scan.setFilter(filter1);
scan.close();
例中的Filter会将所有的小于等于“Hello”的主键过滤出来。
簇过滤器(FamilyFilter)
簇过滤器过滤的是簇的名字。
列过滤器(QualifierFilter)
列过滤器过滤的是列的名字。
值过滤器(ValueFilter)
值过滤器过滤的是扫描对象的值。
单值过滤器(SingleColumnValueFilter)
单值过滤器是以特定列的值为过滤内容,与值过滤器不同的是,这里是特定的列,而值过滤器比较的是行内的所有列。所有在使用单值过滤器的时候要指定比较的列的坐标。
SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOp compareOp, WritableByteArrayComparable comparator)
对于找不到该列的行,可以有特殊的处理
void setFilterIfMissing(boolean filterIfMissing)
默认缺省行将被包含进过滤的结果集中。
前缀过滤器(PrefixFilter)
前缀过滤器将会过滤掉不匹配的记录,过滤的对象是主键的值。
PrefixFilter(byte[] prefix)
页过滤器(PageFilter)
页过滤器可以根据主键有序返回固定数量的记录,这需要客户端在遍历的时候记住页开始的地方,配合scan的startkey一起使用。
PageFilter(int size)
键过滤器(KeyOnlyFilter)
键过滤器可以简单的设置过滤的结果集中只包含键而忽略值,这里有一个选项可以把结果集的值保存为值的长度。
FirstKeyOnlyFilter
在键过滤器的基础上,根据列有序,只包含第一个满足的键。
ColumnPrefixFilter
这里过滤的对象是列的值。
TimestampsFilter
TimestampsFilter(List<Long> times)
这里参数是一个集合,只有包含在集合中的版本才会包含在结果集中。
包装类过滤器,此类过滤器要通过包装其他的过滤器才有意义,是其他过滤器的一种加强。
SkipFilter
SkipFilter(Filter filter)
过滤器集合(FilterList)
Hbase的过滤器设计遵照于设计模式中的组合模式,以上的所有过滤器都可以叠加起来共同作用于一次查询。