Hbase中的过滤器_比较过滤器

  • 概念

HBase 的基本 API,包括增、删、改、查等。
增、删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。
HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,
基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络传输的压力。
使用过滤器至少需要两类参数:
一类是抽象的操作符,另一类是比较器

  • 作用

过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端

  • 种类

过滤器的类型很多,但是可以分为三大类:
比较过滤器:可应用于rowkey、列簇、列、列值过滤器
专用过滤器:只能适用于特定的过滤器
包装过滤器:包装过滤器就是通过包装其他过滤器以实现某些拓展的功能。

  • 比较过滤器

所有比较过滤器均继承自 CompareFilter。创建一个比较过滤器需要两个参数,分别是比较运算符比较器实例

  • 比较运算符

LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
NO_OP 排除所有

  • 常见的六大比较器
  • 1、BinaryComparator

等值比较器

  • 2、BinaryPrefixComparator

前缀比较器,只是比较左端前缀的数据是否相同

  • 3、NullComparator

判断给定的是否为空

  • 4、BitComparator

按位比较

  • 5、RegexStringComparator

提供一个正则的比较器,仅支持 EQUAL 和非EQUAL

  • 6、SubstringComparator

包含比较器,判断提供的子串是否出现在中

一、RowFilter 行键过滤器

需求:通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来

import com.wll.utils.HbaseTool;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;

public class HbaseBiJiaoFilter {
    public static void main(String[] args) throws Exception{
        //通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
        xuQiu1();
    }

    public static void xuQiu1() throws Exception{
        //通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建等值比较器
        BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("1500100010"));
        //创建行键过滤器
        //public RowFilter(final CompareOperator op,final ByteArrayComparable rowComparator)
        RowFilter rowFilter = new RowFilter(CompareOperator.LESS, binaryComparator);
        //设置过滤器
        scan.setFilter(rowFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();

    }
}

二、列簇过滤器:FamilyFilter

需求:通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据

public static void xuQiu2() throws Exception{
        //通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建包含比较器
        SubstringComparator in = new SubstringComparator("in");
        //创建列簇过滤器
        FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL, in);
        //设置过滤器
        scan.setFilter(familyFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }

三、列名过滤器:QualifierFilter

需求:通过QualifierFilter与SubstringComparator查询列名包含na的列的值

public static void xuQiu3() throws Exception{
//        通过QualifierFilter与SubstringComparator查询列名包含na的列的值
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建包含比较器
        SubstringComparator in = new SubstringComparator("na");
        //创建列名过滤器
        QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, in);
        //设置过滤器
        scan.setFilter(qualifierFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }

四、列值过滤器:ValueFilter

需求:通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
只会查询出列值是张前缀的这一列,其他列不查

public static void xuQiu4() throws Exception{
//        通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建前缀比较器
        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));
        //创建列值过滤器
        ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);
        //设置过滤器
        scan.setFilter(valueFilter);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }

五、组合过滤器

需求:查询列名叫name且,列值以'张'开头的

public static void xuQiu5() throws Exception{
        //查询列名叫name且,列值以'张'开头的
        //获取表对象
        Table students = HbaseTool.getOneTable("students");

        //全表查询
        Scan scan = new Scan();
        //创建等值比较器
        BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("name"));
        //创建前缀比较器
        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));
        //创建列名过滤器
        QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, binaryComparator);
        //创建列值过滤器
        ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);
        //创建过滤器集合
        FilterList filterList = new FilterList();
        //添加过滤器到过滤器集合中
        filterList.addFilter(qualifierFilter);
        filterList.addFilter(valueFilter);
        //设置过滤器
        scan.setFilter(filterList);

        ResultScanner scanner = students.getScanner(scan);
        for (Result result : scanner) {
            HbaseTool.printResult(result);
        }
        HbaseTool.close();
    }
posted @ 2024-11-20 16:49  w我自横刀向天笑  阅读(10)  评论(0编辑  收藏  举报