再多学一点吧

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

HBase过滤器

 

 比较运算符

* LESS <

* LESS_OR_EQUAL <=

* EQUAL =

* NOT_EQUAL <>

* GREATER_OR_EQUAL >=

* GREATER >

* NO_OP 排除所有

六大比较过滤器

###### BinaryComparator

> 按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])

###### BinaryPrefixComparator

> 通BinaryComparator,只是比较左端前缀的数据是否相同

###### NullComparator

> 判断给定的是否为空

###### BitComparator

> 按位比较

###### RegexStringComparator

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

###### SubstringComparator

> 判断提供的子串是否出现在中

专业过滤器

单列值过滤器:SingleColumnValueFilter

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

列值排除过滤器:SingleColumnValueExcludeFilter

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

rowkey前缀过滤器:PrefixFilter

> 通过PrefixFilter查询以150010008开头的所有前缀的rowkey

分页过滤器PageFilter

实例代码

1.RegexStringComparator+ValueFilter 

复制代码
@Test
    //RegexStringComparator+ValueFilter
    //ValueFilter会将比较器作用到所有的列值上,相当于作用到每一个cell上
    //把符合比较器规则的cell过滤出来,不符合的直接丢弃
    public void Filter1() throws IOException {

        Scan scan = new Scan();

        //^以什么为开头,.*表示全部,$表示已什么为结尾
        RegexStringComparator rsc = new RegexStringComparator("^文科.*班$");
        ValueFilter valueFilter = new ValueFilter(EQUAL, rsc);
        scan.setFilter(valueFilter);
        ResultScanner rs = sT.getScanner(scan);
        for (Result r : rs) {

            for (Cell cell : r.listCells()) {
                String values = Bytes.toString(CellUtil.cloneValue(cell));
                System.out.println(values);
            }
//            String id = Bytes.toString(r.getRow());
//            String name = Bytes.toString(r.getValue("info".getBytes(), "name".getBytes()));
//            String age = Bytes.toString(r.getValue("info".getBytes(), "age".getBytes()));
//            String sex = Bytes.toString(r.getValue("info".getBytes(), "sex".getBytes()));
//            String clazz = Bytes.toString(r.getValue("info".getBytes(), "clazz".getBytes()));
//            System.out.println(id+","+name+","+age+","+sex+","+clazz);
        }


    }
复制代码

 

 

 

 2.RegexStringComparator+SingleColumnValueFilter

复制代码
@Test
    // RegexStringComparator比较器
    // SingleColumnValueFilter过滤器,对单列进行过滤,
    // 注意和SingleColumnValueExcludeFilter区分,这也是过滤列,但不输出此列
    public void Filter2() throws IOException {
        Scan scan = new Scan();


        SingleColumnValueFilter scv =
                new SingleColumnValueFilter("info".getBytes(),"clazz".getBytes(),
                        CompareFilter.CompareOp.EQUAL,
                        new RegexStringComparator("^文科.*班$"));

        scan.setFilter(scv);
        ResultScanner rs = sT.getScanner(scan);
        for (Result r : rs) {
            String s = Bytes.toString(r.getRow());
            for (Cell cell : r.listCells()) {

                String values = Bytes.toString(CellUtil.cloneValue(cell));
                s=s+" "+values;

            }
            System.out.println(s);

        }
    }
复制代码

 

3.SubstringComparator+QualifierFilter

可以写一个方法吧重复的代码进行处理

复制代码
//这里可以写一个方法把重复的代码进行处理
    public void printScannerWithFilter(Filter filter) throws IOException {
        Scan scan = new Scan();
        scan.setFilter(filter);
        ResultScanner rs = sT.getScanner(scan);
        for (Result r : rs) {
            String s = Bytes.toString(r.getRow());
            for (Cell cell : r.listCells()) {
                String values = Bytes.toString(CellUtil.cloneValue(cell));
                s+=" "+values+" ";
            }
            System.out.println(s);
        }
    }
复制代码

 

复制代码
    @Test
    // SubstringComparator 判断提供的子串是否出现在中
    // QualifierFilter,列过滤器,根据列名过滤出符合条件的列
    public void Filter3() throws IOException {
//筛选出age,name,clazz列 SubstringComparator a = new SubstringComparator("a"); QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, a); //直接调用我下面写的方法 printScannerWithFilter(qualifierFilter); }
复制代码

 

4.BinaryPrefixComparator+RowFilter

    @Test
    //BinaryPrefixComparator比较器,按字节索引顺序比较指定字节数组,只是比较左端前缀的数据是否相同
    //RowFilter 行键过滤器
    public void Filter4() throws IOException {
        BinaryPrefixComparator bpc = new BinaryPrefixComparator("150010098".getBytes());
        RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, bpc);
        printScannerWithFilter(rowFilter);
    }

 

 

 5.rowkey前置过滤器,等于BinaryPrefixComparator+RowFilter

 //专用过滤器:rowkey前置过滤器PrefixFliter
    //相当于BinaryPrefixComparator+RowFilter
    @Test
    public  void Filter5() throws IOException {
        PrefixFilter prefixFilter = new PrefixFilter("150010098".getBytes());
        printScannerWithFilter(prefixFilter);
    }

 

 5.过滤器综合用FilterList存储

复制代码
@Test
    //过滤age>=23,sex=男,ROWKEY以150010010开头所有学生数据
    public void Filter6() throws IOException {
        SingleColumnValueFilter age =
                new SingleColumnValueFilter(
                        "info".getBytes(),
                        "age".getBytes(),
                        CompareFilter.CompareOp.GREATER_OR_EQUAL,
                        "23".getBytes()
                );
        SingleColumnValueFilter sex =
                new SingleColumnValueFilter(
                        "info".getBytes(),
                        "sex".getBytes(),
                        CompareFilter.CompareOp.EQUAL, "男".getBytes()
                );
        PrefixFilter prefixFilter = new PrefixFilter("150010010".getBytes());
        //创建一个filter数组存储多个过滤器
        FilterList filterList = new FilterList();
        filterList.addFilter(age);
        filterList.addFilter(sex);
        filterList.addFilter(prefixFilter);

        printScannerWithFilter(filterList);
    }
复制代码

 

 

posted on   糟糟张  阅读(99)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示