hbase学习笔记-过滤器

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

1 hbase过滤器的比较运算符

LESS  <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >

2 hbase过滤器的比较器

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

3 过滤器使用

3.1 针对行键的前缀过滤器(PrefixFilter)
public void testFilter1() throws Exception {

// 针对行键的前缀过滤器
  Filter pf = new PrefixFilter(Bytes.toBytes("liu"));//"liu".getBytes()
  testScan(pf);
}

     //定义一个方法,接受一个过滤器,返回结果数据
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();
        //遍历所有的Result对象,获取结果
        while (iter.hasNext()) {
            Result result = iter.next();
            List<Cell> cells = result.listCells();
            for (Cell c : cells) {
                //获取行键
                byte[] rowBytes = CellUtil.cloneRow(c);
                //获取列族
                byte[] familyBytes = CellUtil.cloneFamily(c);
                //获取列族下的列名称
                byte[] qualifierBytes = CellUtil.cloneQualifier(c);
                //列字段的值
                byte[] valueBytes = CellUtil.cloneValue(c);

                System.out.print(new String(rowBytes)+" ");
                System.out.print(new String(familyBytes)+":");
                System.out.print(new String(qualifierBytes)+" ");
                System.out.println(new String(valueBytes));
            }
            System.out.println("-----------------------");
        }
        }

3.2 行过滤器(RowFilter)
  public void testFilter2() throws Exception {

        // 行过滤器  需要一个比较运算符和比较器
        RowFilter rf1 = new RowFilter(CompareFilter.CompareOp.LESS,
                                      new BinaryComparator(Bytes.toBytes("user2")));
		 testScan(rf1);
		  //rowkey包含"01"子串的
		 RowFilter rf2 = new RowFilter(CompareFilter.CompareOp.EQUAL, 
		                               new SubstringComparator("01"));
		 testScan(rf2);
}
3.3 列族的过滤器(FamilyFilter)
  public void testFilter3() throws Exception {

//针对列族名的过滤器   返回结果中只会包含满足条件的列族中的数据
		FamilyFilter ff1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("base_info")));
	    FamilyFilter ff2 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("base")));
		testScan(ff2);

}
3.4 列名的过滤器(QualifierFilter)
public void testFilter4() throws Exception {

//针对列名的过滤器 返回结果中只会包含满足条件的列的数据
	QualifierFilter qf1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("password")));
	QualifierFilter qf2 = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("user")));
	testScan(qf2);
}
3.5 列值的过滤器(SingleColumnValueFilter)
public void testFilter4() throws Exception {
    
//针对指定一个列的value的比较器来过滤
		ByteArrayComparable comparator1 = new RegexStringComparator("^zhang"); //以zhang开头的
		ByteArrayComparable comparator2 = new SubstringComparator("si");       //包含"si"子串
		SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "username".getBytes(), CompareFilter.CompareOp.EQUAL, comparator2);
		testScan(scvf);

}
3.6 多个过滤器同时使用
public void testFilter4() throws Exception {
    
//多个过滤器同时使用   select * from t1 where id >10 and age <30
    
//构建一个列族的过滤器            
FamilyFilter cfff1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("base")));

//构建一个列的前缀过滤器
            ColumnPrefixFilter cfff2 = new ColumnPrefixFilter("password".getBytes());

//指定多个过滤器是否同时都要满足条件
            FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);

            filterList.addFilter(cfff1);
            filterList.addFilter(cfff2);
            testScan(filterList);
}  
发布了40 篇原创文章 · 获赞 59 · 访问量 1413

猜你喜欢

转载自blog.csdn.net/qq_26719997/article/details/104960303
今日推荐