hbase 分页过滤

原文连接:https://www.cnblogs.com/asker009/p/10699220.html

 

在hbase2.0以前分页过滤必须以上一次的最后一行+空字节数组作为下一次的起始行,

因为scan扫描的时候是包含起始行的,为了既能准确定位起始行,但又不重复把上一次的最末一行加入下一页,

所以,权威指南里才有了加上空字节数组的处理。

hbase2.0以后,新的api是withStartRow(byte[] startRow, boolean inclusive),可以直接设置是否包含起始行,完美解决问题,但是又保留了对以前api函数的兼容性。

//分页过滤
    private static void pageFilterData() throws IOException{
        Table table = helper.getConnection().getTable(TableName.valueOf("testtable"));
        final byte[] POSTFIX = new byte[] { 0x00 };
        Filter filter = new PageFilter(10);

        int totalRows = 0;
        byte[] lastRow = null;
        while(true){
            Scan scan = new Scan();
            scan.setFilter(filter);
            if(lastRow!=null){

               //为了兼容以前的scan.setStartRow()代码
               //在上一次的最后一行加上一个空的byte数据,在下一个分页上,就会以新的key开始,
               // 但是实际上这个key并不存在,所以还是从真正的下一行开始扫描
               //这么做的原因是scan的扫描会自动包含起始行,如果不加空字节数据,那么定位上就会把上一次的最后一行作为起始行,最后的数据就会多一行。
                //而,新的api是withStartRow(byte[] startRow, boolean inclusive),可以直接设置是否包含起始行,完美解决问题,但是又保留了对
                //以前api函数的兼容性
//              byte[] startRow = Bytes.add(lastRow,POSTFIX);
//              System.out.println("start row: " + Bytes.toStringBinary(startRow));
//              scan.withStartRow(startRow,true);

                System.out.println("start row: " + Bytes.toStringBinary(lastRow));
                //不包含起始行,所以可以直接使用上一次的最后一行作为起始行
                scan.withStartRow(lastRow,false);
            }
            ResultScanner scanner = table.getScanner(scan);
            int localRows = 0;
            Result result;
            while ((result=scanner.next())!=null){
                System.out.println(localRows++ + ": " + result);
                totalRows++;
                lastRow = result.getRow();
            }
            scanner.close();
            if(localRows==0)break;
        }
        System.out.println("total rows: " + totalRows);
    }

 

起始行加了空字节数据,形成了新的定位行(相当于真正的两页之间插入了一个虚拟行用于定位),解决了下一页首行的问题。

新的api输出:下一页的定位行就是上一页的末行,采用新的API设置首行的时候把inclusive设置成false(即不包含首行),那么输出结果就是正确的。

你可能感兴趣的:(hbase)