HBASE过滤器整合代码应用

HBASE过滤器大全

整合使用

/**
 * @describe:定义一个方法,接受一个过滤器,返回结果数据
 * @Param: [filter] 过滤
 * @Return: void
 */
public void testScan(Filter filter) throws Exception {
    //拿到表对象
    Table table = conn.getTable(TableName.valueOf("t_user_info"));

    Scan scan = new Scan();
    //设置过滤器
    scan.setFilter(filter);
    //返回满足条件的结果
    ResultScanner scanner = table.getScanner(scan);

    //以迭代器的形式返回
    Iterator<Result> iter = scanner.iterator();
    while (iter.hasNext()) {
        Result result = iter.next();
        CellScanner cellScanner = result.cellScanner();
        while (cellScanner.advance()) {
            Cell current = cellScanner.current();
            byte[] rowArray = current.getRowArray();
            byte[] familyArray = current.getFamilyArray();
            byte[] valueArray = current.getValueArray();
            byte[] qualifierArray = current.getQualifierArray();
            //打印结果
            System.out.println(new String(rowArray, current.getRowOffset(), current.getRowLength()));
            System.out.print(new String(familyArray, current.getFamilyOffset(), current.getFamilyLength()));
            System.out.print(":" + new String(qualifierArray, current.getQualifierOffset(), current.getQualifierLength()));
            System.out.println(" " + new String(valueArray, current.getValueOffset(), current.getValueLength()));
        }
        System.out.println("-----------------------");
    }
}



 /**
     * 过滤器使用
     *
     * @throws Exception
     */
    @Test
    public void testFilter() throws Exception {

        // 1.针对行键的前缀过滤器(将字符串转化成字节数组)
    /*    Filter pf = new PrefixFilter(Bytes.toBytes("liu"));
        testScan(pf);*/

        // 2.行过滤器  需要一个 比较运算符 和 比较器(比user002小的都可以打印出来的user002)
/*     RowFilter rf1 = new RowFilter(CompareOp.LESS, new BinaryComparator(Bytes.toBytes("user002")));
         testScan(rf1);*/

       /*RowFilter rf2 = new RowFilter(CompareOp.EQUAL, new SubstringComparator("01"));//rowkey包含"01"子串的
       testScan(rf2);*/

        // 3.针对指定一个列的value来过滤(把passwoord等于123456 的打印出来)
        //SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "password".getBytes(), CompareOp.EQUAL, "123456".getBytes());
   /* SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "password".getBytes(), CompareOp.LESS, "zzzz".getBytes());
      scvf.setFilterIfMissing(false);   // true表示如果指定的列缺失,则也过滤掉不显示,为false表示不过滤也显示(测试一下)
      testScan(scvf);*/

        //4.针对指定一个列的value的比较器来过滤
//    ByteArrayComparable comparator1 = new RegexStringComparator("^zhang"); //以zhang开头的
//    ByteArrayComparable comparator2 = new SubstringComparator("si");      //包含"si"子串
//    SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "username".getBytes(), CompareOp.EQUAL, comparator1);
//    SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "username".getBytes(), CompareOp.EQUAL, comparator2);
//    testScan(scvf);


        //5.针对列族名的过滤器   返回结果中只会包含满足条件的列族中的数据
        //列簇是basicInfo的打印出来
      /*  FamilyFilter ff1 = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("base_info"))); //
        //列簇是一base开头的信息
        FamilyFilter ff2 = new FamilyFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("base")));
        testScan(ff2);*/

        //6.针对列名的过滤器 返回结果中只会包含满足条件的列的数据
      /*QualifierFilter qf1 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("password")));
      QualifierFilter qf2 = new QualifierFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("user")));
      testScan(qf1);
      testScan(qf2);*/

        //7.跟SingleColumnValueFilter结果不同,只返回符合条件的该column
        //列族的前缀
   /* ColumnPrefixFilter cf = new ColumnPrefixFilter("passw".getBytes());
      testScan(cf);*/


        //8.多个列进行过滤,只需要满足一个条件就可以,是或者的关系
   /* byte[][] prefixes = new byte[][] { Bytes.toBytes("username"),Bytes.toBytes("password") };
      MultipleColumnPrefixFilter mcf = new MultipleColumnPrefixFilter(prefixes);
      testScan(mcf);*/

        //9.多个过滤器同时使用
        FamilyFilter ff2 = new FamilyFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("base")));
        ColumnPrefixFilter cf = new ColumnPrefixFilter("password".getBytes());
        FilterList filterList = new FilterList(Operator.MUST_PASS_ALL);
        filterList.addFilter(ff2);
        filterList.addFilter(cf);
        testScan(filterList);
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值