HBase过滤器的使用

基本概念

HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器筛选的数据能够细化到具体的一个存储单元格上(由行键、列名、时间戳定位)。通常来说,通过行键、值来筛选数据的应用场景较多。

HBase中的过滤器类似于SQL中的Where条件。
过滤器在客户端创建,然后通过RPC发送到服务器上,由服务器执行,执行流程如下图:

《HBase过滤器的使用》 过滤器执行流程图

客户端首先创建Scan过滤器,然后将装载过滤器数据的序列化对象Scan发送到HBase的各个RegionServer上(这是一个服务端过滤器),这样也可以降低网络传输的压力。RegionServer使用Scan和内部的扫描器对数据进行过滤操作。

使用过滤器至少需要两类参数,一类是抽象的操作符。HBase 提供了枚举类型的变量来表示这些抽象的操作符,含义如下:
LESS 小于
LESS_OR_EQUAL 小于等于
EQUAL 等于
NOT_EQUAL 不等于
GREATER_OR_EQUAL 大于等于
GREATER 大于
NO_OP 无操作

另一类是比较器,比较器作为过滤器的核心组成之一,用于处理具体的比较逻辑,例如字节级的比较,字符串级的比较等。常用的比较器及含义如下:
BinaryComparator :二进制比较器,用于按字典顺序比较 Byte 数据值。采用Bytes.compareTo(byte[])
BinaryPrefixComparator :前缀二进制比较器。与二进制比较器不同的是,只比较前缀是否相同
NullComparator :判断给定的值是否为空
RegexStringComparator :提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
SubstringComparator :用于监测一个子串是否存在于值中,并且不区分大小写

行键过滤器

筛选出匹配的所有的行,使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符来筛选出符合某一条件的多条数据。例如下面的例子,从表t1中筛选出行键为row1的一行数据:

Table table =conn.getTable(TableName.valueOf("t1"));
Scan scan = new Scan();
Filter filter = new RowFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("row1"))); 
scan.setFilter(filter);
ResultScanner rs = table.getScanner(scan);  
for (Result res : rs) {  
      System.out.println(res);            
}

列族过滤器

筛选出符合条件的所有列族数据。例如下面的例子,筛选出列族为f1的所有数据。

Table table =conn.getTable(TableName.valueOf("t1"));
Scan scan = new Scan();
Filter filter = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); 
scan.setFilter(filter);
ResultScanner rs = table.getScanner(scan);  
for (Result res : rs) {  
      System.out.println(res);            
}

列过滤器

根据列名进行筛选数据。例如下面的例子,筛选出列名为name的所有数据。

Scan scan = new Scan();
Filter filter = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("name"))); 
scan.setFilter(filter);

值过滤器

按照具体的值来筛选单元格的过滤器,这会把一行中值不能满足条件的单元格过滤掉。例如下面的例子:
筛选出一行中的值包含”xiaoming”的所有单元格数据。

Scan scan = new Scan();
Filter filter = new ValueFilter(CompareOp.EQUAL, new SubstringComparator("xiaoming"));
scan.setFilter(filter);

单列值过滤器

用一列的值是否满足条件来决定该行是否被过滤。在它的具体对象上,可以调用setFilterIfMissing(true)或者setFilterIfMissing(false),默认值是false。其作用是,对于要使用作为条件的列,如果这一列本身就不存在,默认这样的行会包含在结果集中。如果设置为true,这样的行会被过滤掉。
例如下面的例子:筛选出name列不包含zhangsan的所有行数据。

Filter filter = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("name"),CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("xiaoming")); 
////如果某行列name不存在,那么该行将被过滤掉,false则不进行过滤,默认为false。
((SingleColumnValueFilter) filter).setFilterIfMissing(true);
    原文作者:奋斗在IT
    原文地址: https://www.jianshu.com/p/ef8e20592e44
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞