HBASE 过滤器整合

引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器
过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;

在hbase shell中查询数据,可以在hbase shell中直接使用过滤器:

#hbase shell
scan ‘testByCrq’, FILTER=>“ValueFilter(=,‘substring:111’)”

如上命令所示,查询的是表名为testByCrq,过滤方式是通过value过滤,匹配出value含111的数据。
因在hbase shell中一些操作比较麻烦(比如删除字符需先按住ctrl在点击退格键),且退出后,查询的历史纪录不可考,故如下方式是比较方便的一种:

#echo “scan ‘testByCrq’, FILTER=>“ValueFilter(=,‘substring:111’)”” | hbase shell

如上命令,可在bash中直接使用,表名是testByCrq,过滤方式是通过value过滤,匹配出value含111的数据,中间的"需要用\转义。

以下介绍在hbase shell中常用的过滤器:

scan ‘testByCrq’, FILTER=>“RowFilter(=,‘substring:111’)”

如上命令所示,查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey含111的数据。

scan ‘testByCrq’, FILTER=>“RowFilter(=,‘binary:0111486816556’)”

如上命令所示,查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey等于0111486816556的数据。

scan ‘testByCrq’, FILTER=>“RowFilter(<=,‘binary:0111486816556’)”

如上命令所示,查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey小于等于0111486816556的数据。

scan ‘testByCrq’, FILTER=>“ValueFilter(=,‘substring:111’)”

如上命令所示,查询的是表名为testByCrq,过滤方式是通过value过滤,匹配出value含111的数据。

scan ‘testByCrq’, FILTER=>“FamilyFilter(=,‘substring:f’)”

如上命令所示,查询的是表名为testByCrq,过滤方式是通过列簇过滤,匹配出列簇含f的数据。
注:substring不能使用小于等于等符号。

scan ‘testByCrq’, FILTER=>“PrefixFilter(‘00000’)”

如上命令所示,查询的是表名为testByCrq,过滤方式是通过前缀过滤过滤的是行键,匹配出前缀为00000的数据






\

hbase过滤器的比较运算符:(按照字典顺序进行比较)

	LESS  <
	LESS_OR_EQUAL <=
	EQUAL =
	NOT_EQUAL <>
	GREATER_OR_EQUAL >=
	GREATER >
	NO_OP 排除所有(不做任何操作 等待)

Hbase过滤器的比较器(指定比较机制)

	BinaryComparator  按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])
	BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同
	NullComparator 判断给定的是否为空
	BitComparator 按位比较
	RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
	SubstringComparator 判断提供的子串是否出现在value中。

Hbase的过滤器分类

比较过滤器

  1. 行键过滤器RowFilter

    Filter filter1 = new RowFilter(CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("row-22")));  
    scan.setFilter(filter1);  
    
  2. 列族过滤器FamilyFilter

    Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("colfam3")));
    scan.setFilter(filter1);  
    
  3. 列过滤器QualifierFilter

    filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("col-2")));
    scan.setFilter(filter1);
    
  4. 值过滤器 ValueFilter

    Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(".4") );  
    scan.setFilter(filter1);  
    

专用过滤器

  1. 单列值过滤器 SingleColumnValueFilter ----会返回满足条件的整行

    SingleColumnValueFilter filter = new SingleColumnValueFilter(  
        Bytes.toBytes("colfam1"),  
        Bytes.toBytes("col-5"),  
        CompareFilter.CompareOp.NOT_EQUAL,  
        new SubstringComparator("val-5"));  
    filter.setFilterIfMissing(true);  //如果不设置为true,则那些不包含指定column的行也会返回
    scan.setFilter(filter1);  
    
  2. SingleColumnValueExcludeFilter

    与上相反
    
  3. 前缀过滤器 PrefixFilter----针对行键

    Filter filter = new PrefixFilter(Bytes.toBytes("row1"));  
    scan.setFilter(filter1);  
    
  4. 列前缀过滤器 ColumnPrefixFilter

    Filter filter = new ColumnPrefixFilter(Bytes.toBytes("qual2"));  
    scan.setFilter(filter1);  
    
  5. 分页过滤器 PageFilter

    /**
     * 分页查询
     *
     * @throws Exception
     */
    @Test
    public void pageScan() throws Exception {
        //定义一个字节数组(0x00  这是我们给的一个随机数)
        final byte[] POSTFIX = new byte[]{0x00};
        //定义一个table对象
        Table table = conn.getTable(TableName.valueOf("t_user_info"));
        //一次需要获取一页的条数
        Filter filter = new PageFilter(3);
        //定义个字节数组
        byte[] lastRow = null;
        //总数 初始值0
        int totalRows = 0;
        while (true) {
            Scan scan = new Scan();
            //权标扫描,每次返回三条
            scan.setFilter(filter);
            if (lastRow != null) {
                byte[] startRow = Bytes.add(lastRow, POSTFIX);   //设置本次查询的起始行键 00000030x00
                scan.setStartRow(startRow);
            }
            ResultScanner scanner = table.getScanner(scan);
            int localRows = 0; //开始行号
            Result result;
            //如果不等null  说明里面有值
            while ((result = scanner.next()) != null) {
                System.out.println(++localRows + ":" + result);
                totalRows++;
                //结果赋值
                lastRow = result.getRow();    //0000003
            }
            scanner.close();
            //重新赋值0,在进行下一次的查询
            if (localRows == 0) {
                break;
            }
            Thread.sleep(2000);
        }
        System.out.println("total rows:" + totalRows);
        //关闭
        table.close();
        conn.close();
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值