Hbase过滤器

使用过滤器至少需要两类参数:

1.抽象操作符

2.比较器

作用及类型

1.在客户端判断数据是否满足条件,将满足条件的数据返回到客户端

2.过滤器类型:

比较过滤器可应用于rowkey、列簇、列、列值过滤器
专用过滤器只能适用于特定的过滤器
包装过滤器包装过滤器就是通过包装其他过滤器以实现某些拓展的功能

比较过滤器:

比较过滤器均继承自CompareFilter,创建一个比较过滤器需要两个参数

1.比较运算符:LESS< , LESS_OR_EOUAL<=, EQUAL=, GREATER_OR_EQUAL>=

,NOT_EQUAL<>,  NO_OP排除所有

2.比较器实例

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

比较过滤器包括

rowkeyFilter(行键)过滤器

通过RowFilter与BinaryComparator过滤比rowKey (行键)小的所有值

public class HbaseFilter {
    private Connection conn;
    private Admin admin;

@Before
    public void connection(){
    try {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
        conn= ConnectionFactory.createConnection(conf);
        admin=conn.getAdmin();
        System.out.println("成功获取数据库的连接对象"+conn);
        System.out.println("成功获取数据库的操作对象"+admin);
    }catch (Exception e){
        e.printStackTrace();
    }
}
/**
 *通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
 */
@Test
    public void rowFilterWithBinaryComparator(){
    try {
        TableName tableName = TableName.valueOf("students");
        if (!admin.tableExists(tableName)){
            System.out.println(Bytes.toString(tableName.getName())+"表不存在,查询失败");
            return;
        }
        Table students = conn.getTable(tableName);
        Scan scan = new Scan();
        BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("1500100010"));
        RowFilter rowFilter = new RowFilter(CompareOperator.LESS, binaryComparator);
        scan.setFilter(rowFilter);
        ResultScanner studentsScanner = students.getScanner(scan);
        Iterator<Result> resultIterator = studentsScanner.iterator();
        while (resultIterator.hasNext()){
            Result result = resultIterator.next();
            HbaseUtil.printResult(result);

        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

@After
    public void close(){
        if (admin!=null){
            try {
                admin.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try {
                conn.close();
            }catch (Exception e){
                e.printStackTrace();
            }
         }
     }
}

FamilyFilter(列簇)过滤器

通过FamilyFilter与SubstringComparator查询列簇名包含(xx)的所有列簇下面的数据

QualifierFilter(列名)过滤器

通过QualifierFilter与SubstringComparator查询列名包含(xx)的列的值

ValueFilter(列值)过滤器

通过ValueFilter与BinaryPrefixComparator 过滤出所有的单元格(cell)中值以 "施" 开头的学生 只查询列值是"施"前缀的这一列,其他列不查

专用过滤器

1.单列值过滤器(SingleColumnValueFilter)

会返回满足条件的cell所在行的所有cell的值

2.列值排除过滤器(SingleColumnValueExcludeFilter)

会排除掉指定的列,其他的列全部返回

3.前缀(prefix)过滤器(PrefixFilter)

查询以xxx开头的所有前缀的rowkey

4.分页过滤器(PageFilter)

@Test
    public void pageFilter() {
        try {
            TableName tableName = TableName.valueOf("students");
            Table students = conn.getTable(tableName);
            //定义一些变量
            //定义查询的页数
            int pageNum = 5;
            int pageDataNumber = 10;
            //设置最开始的行
            Scan scan = new Scan();
            scan.withStartRow(Bytes.toBytes(""));
            //创建一个分页过滤器
            PageFilter pageFilter = new PageFilter(pageDataNumber);
            scan.setFilter(pageFilter);
            for (int i = 1; i < pageNum; i++) {
                System.out.println("=============当前是第 " + i + " 页数据==========");
                ResultScanner studentsScanner = students.getScanner(scan);
                Iterator<Result> resultIterator = studentsScanner.iterator();
                while (resultIterator.hasNext()) {
                    Result result = resultIterator.next();

                    //TODO: 关键代码,查找下一条数据的关键
                    scan.withStartRow(Bytes.toBytes(Bytes.toString(result.getRow()) + "0"));
                    HbaseUtil.printResult(result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

包装过滤器

1.SkipFilter过滤器

 /**
         * SkipFiler
         */
        @Test
        public void skipFilter(){
            try {
                TableName tableName = TableName.valueOf("students");
                Table students = conn.getTable(tableName);
                ValueFilter valueFilter = new ValueFilter(CompareOperator.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("易政")));
                SkipFilter skipFilter = new SkipFilter(valueFilter);
                Scan scan = new Scan();
                scan.setFilter(skipFilter);
                ResultScanner resultScanner = students.getScanner(scan);
                Iterator<Result> iterator = resultScanner.iterator();
                while (iterator.hasNext()){
                    Result result = iterator.next();
                    HbaseUtil.printResult(result);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

2.WhileMatchFilter过滤器

当被包装的过滤器遇到一个需要过滤的 KeyValue 实例时,WhileMatchFilter 则结束本次扫描

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值