HBase过滤器的使用

作者: 小鱼的旅行 | 来源:发表于2017-11-28 13:32 被阅读0次

    基本概念

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

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


    过滤器执行流程图

    客户端首先创建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);
    

    相关文章

      网友评论

        本文标题:HBase过滤器的使用

        本文链接:https://www.haomeiwen.com/subject/wrunvxtx.html