hbase 过滤器

 *  三大类过滤器:
 *      1. 比较过滤器
 *      2. 专用过滤器
 *      3. 包装过滤器
比较运算符
* LESS  <

* LESS_OR_EQUAL <=

* EQUAL =

* NOT_EQUAL <>

* GREATER_OR_EQUAL >=

* GREATER >

* NO_OP 排除所有

比较过滤器 (行键,列簇,列名,列值)

1.rowKey过滤器:RowFilter 行键过滤器

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

点击查看代码
    /**
     *  需求1:通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
     */
    @Test
    public void rowFilterAndBinaryFun(){
        try {
            //将表名封装成TableName的对象
            TableName students = TableName.valueOf("students");

            //获取表的实例
            Table table = conn.getTable(students);

            //创建Scan对象
            Scan scan = new Scan();
            //创建BinaryComparator比较器
            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 resultScanner = table.getScanner(scan);
            //输出结果
            printResultScanner(resultScanner);


        }catch (Exception e){
            e.printStackTrace();
        }
    }

列簇过滤器:FamilyFilter

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

点击查看代码
       /**
     * 通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据
     */
    @Test
    public void FamilyFilterAndSubstringFun(){
        try {
            TableName students = TableName.valueOf("students2");

            Table table = conn.getTable(students);

            Scan scan = new Scan();

            //创建包含比较in
            SubstringComparator substringComparator = new SubstringComparator("in");

            //创建列簇过滤器
            //public FamilyFilter(final CompareOperator op, final ByteArrayComparable familyComparator)
            FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL, substringComparator);

            scan.setFilter(familyFilter);

            ResultScanner resultScanner = table.getScanner(scan);

            printResultScanner(resultScanner);

        }catch (Exception e){
            e.printStackTrace();
        }
    }

列名过滤器QualifierFilter

通过QualifierFilter与SubstringComparator查询列名包含ge的列的值

点击查看代码
    /**
     * 通过QualifierFilter与SubstringComparator查询列名包含 ‘级’ 的列的值
     */
    @Test
    public void qualifierFilterAndSubstringFun(){
        try {
            TableName students = TableName.valueOf("students2");

            Table table = conn.getTable(students);

            Scan scan = new Scan();

            //创建包含比较器
            SubstringComparator substringComparator = new SubstringComparator("级");

            //创建列名过滤器
            //public QualifierFilter(final CompareOperator op, final ByteArrayComparable qualifierComparator)
            QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, substringComparator);

            scan.setFilter(qualifierFilter);

            ResultScanner scanner = table.getScanner(scan);

            printResultScanner(scanner);
        }catch (Exception e){
            e.printStackTrace();
        }
    }   

列值过滤器:ValueFilter

通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生  
只会查询出列值是张前缀的这一列,其他列不查
点击查看代码
    /**
     * 通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
     */
    @Test
    public void valueFilterAndBinaryPrefixFun(){
        try {
            TableName students = TableName.valueOf("students2");

            Table table = conn.getTable(students);

            Scan scan = new Scan();
            //创建二进制前缀比较器
            BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));

            //创建列值过滤器
            //public ValueFilter(final CompareOperator valueCompareOp, final ByteArrayComparable valueComparator)
            ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);

            scan.setFilter(valueFilter);

            ResultScanner scanner = table.getScanner(scan);

            printResultScanner(scanner);
        }catch (Exception e){
            e.printStackTrace();
        }
    }  

专用过滤器

单列值过滤器:SingleColumnValueFilter

SingleColumnValueFilter会返回满足条件的cell所在行的所有cell的值(即会返回一行数据)

通过SingleColumnValueFilter与查询文科班所有学生信息
点击查看代码
    public static void xuQiu1() throws Exception {
        //获取表对象
        Table students2 = HbaseTool.getOneTable("students");
        Scan scan = new Scan();

        //SingleColumnValueFilter
        //SingleColumnValueFilter(final byte [] family, final byte [] qualifier,
        //      final CompareOperator op,
        //      final org.apache.hadoop.hbase.filter.ByteArrayComparable comparator)
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("age"),
                CompareOperator.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("22")));

        //设置过滤器
        //Scan setFilter(Filter filter)
        scan.setFilter(singleColumnValueFilter);

        ResultScanner studentsScanner = students2.getScanner(scan);
        for (Result rs : studentsScanner) {
            HbaseTool.printResult(rs);
        }

        HbaseTool.close();
    }

列值排除过滤器:SingleColumnValueExcludeFilter

与SingleColumnValueFilter相反,会排除掉指定的列,其他的列全部返回

通过SingleColumnValueExcludeFilter与BinaryComparator查询文科一班所有学生信息,最终不返回clazz列
点击查看代码
    public static void xuQiu2() throws Exception {
        //获取表对象
        Table students2 = HbaseTool.getOneTable("students");
        Scan scan = new Scan();

        //单列值排除过滤器
        //SingleColumnValueExcludeFilter(final byte[] family, final byte[] qualifier,
        //      final CompareOp compareOp, ByteArrayComparable comparator)
        SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(Bytes.toBytes("info"), Bytes.toBytes("age"),
                CompareOperator.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("22")));

        //设置过滤器
        //Scan setFilter(Filter filter)
        scan.setFilter(singleColumnValueExcludeFilter);

        ResultScanner studentsScanner = students2.getScanner(scan);
        for (Result rs : studentsScanner) {
            HbaseTool.printResult(rs);
        }

        HbaseTool.close();
    }

rowkey前缀过滤器:PrefixFilter
通过PrefixFilter查询以15001001开头的所有前缀的rowkey
点击查看代码
        //做法1:使用比较过滤器实现,行键过滤器+前缀比较器

    public static void xuQiu3() throws Exception {
        //获取表对象
        Table students2 = HbaseTool.getOneTable("students2");
        Scan scan = new Scan();


        RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("15001005")));

        //设置过滤器
        //Scan setFilter(Filter filter)
        scan.setFilter(rowFilter);

        ResultScanner studentsScanner = students2.getScanner(scan);
        for (Result rs : studentsScanner) {
            HbaseTool.printResult(rs);
        }

        HbaseTool.close();
    }






        //做法2:专用过滤器,PrefixFilter

    public static void xuQiu4() throws Exception {
        //获取表对象
        Table students2 = HbaseTool.getOneTable("students2");
        Scan scan = new Scan();

        PrefixFilter prefixFilter = new PrefixFilter(Bytes.toBytes("15001005"));

        //设置过滤器
        //Scan setFilter(Filter filter)
        scan.setFilter(prefixFilter);

        ResultScanner studentsScanner = students2.getScanner(scan);
        for (Result rs : studentsScanner) {
            HbaseTool.printResult(rs);
        }

        HbaseTool.close();
    }
        分页过滤器:PageFilter
        查询前3页数据,每10条数据为一页

`

点击查看代码
    public static void xuQiu5() throws Exception {
        //获取表对象
        Table students2 = HbaseTool.getOneTable("students2");
        Scan scan = new Scan();

        //定义页数
        int pageNum = 3;
        //定义每页的条数
        int pageDataNum = 10;
        //定义开始行
        String startRowKey = "";

        //创建一个分页过滤器
        PageFilter pageFilter = new PageFilter(pageDataNum);

        for (int i = 1; i <= pageNum; i++) {
            System.out.println("=======================当前是第 " + i + " 页数据=======================");
            scan.withStartRow(Bytes.toBytes(startRowKey));
            scan.setFilter(pageFilter);
            ResultScanner scanner = students2.getScanner(scan);
            for (Result result : scanner) {
                HbaseTool.printResult(result);
                startRowKey = Bytes.toString(result.getRow()) + "0";
            }
        }


        HbaseTool.close();

    }
`

包装过滤器

SkipFilter过滤器
> SkipFilter包装一个过滤器,当被包装的过滤器遇到一个需要过滤的 KeyValue 
实例时,则拓展过滤整行数据。下面是一个使用示例:
点击查看代码
    public static void xuQiu1() throws Exception{
        //SkipFilter
        //获取表对象
        Table students2 = HbaseTool.getOneTable("students2");
        Scan scan = new Scan();

        ValueFilter valueFilter = new ValueFilter(CompareOperator.NOT_EQUAL, new SubstringComparator("理科"));

        //创建跳过过滤器
        //SkipFilter(Filter filter)
        SkipFilter skipFilter = new SkipFilter(valueFilter);


        //设置过滤器
        //Scan setFilter(Filter filter)
        scan.setFilter(skipFilter);

        ResultScanner studentsScanner = students2.getScanner(scan);
        for (Result rs : studentsScanner) {
            HbaseTool.printResult(rs);
        }

        HbaseTool.close();
    }

WhileMatchFilter过滤器
> WhileMatchFilter 包装一个过滤器,**当被包装的过滤器遇到一个需要过滤的 KeyValue 实例时**
**WhileMatchFilter 则结束本次扫描**,返回已经扫描到的结果。下面是其使用示例:
点击查看代码
    public static void xuQiu2() throws Exception{
        //WhileMatchFilter
        //获取表对象
        Table students2 = HbaseTool.getOneTable("students2");
        Scan scan = new Scan();

        ValueFilter valueFilter = new ValueFilter(CompareOperator.NOT_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("黄")));

        //创建WhileMatchFilter
        WhileMatchFilter whileMatchFilter = new WhileMatchFilter(valueFilter);

        //设置过滤器
        //Scan setFilter(Filter filter)
        scan.setFilter(whileMatchFilter);

        ResultScanner studentsScanner = students2.getScanner(scan);
        for (Result rs : studentsScanner) {
            HbaseTool.printResult(rs);
        }

        HbaseTool.close();

    }

posted @   wang_jun  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示