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

在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);
  1. 列族过滤器FamilyFilter
Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("colfam3")));
scan.setFilter(filter1);
  1. 列过滤器QualifierFilter
filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("col-2")));
scan.setFilter(filter1);
  1. 值过滤器 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);
  1. SingleColumnValueExcludeFilter
与上相反
  1. 前缀过滤器 PrefixFilter----针对行键
Filter filter = new PrefixFilter(Bytes.toBytes("row1"));  
scan.setFilter(filter1);
  1. 列前缀过滤器 ColumnPrefixFilter
Filter filter = new ColumnPrefixFilter(Bytes.toBytes("qual2"));  
scan.setFilter(filter1);
  1. 分页过滤器 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();
}