简单Hbase 分页方案

简单Hbase分页方案

网上大多数分页方案分为从服务端分页或者从客户端分页 服务端分页方式主要利用PageFilter过滤器,首先太复杂,其次针对集群的兼容性不是很好,作者利用服务端分页+客户端分页结合方式给出一种简单易行的中间方案。

1.利用PageFilter过滤器从服务端分页,过滤出所需要的最大条数,
注:作者认为大多数用户不会进行太深的翻页,假设pageSize=5,客户饭100页一共从服务器获取500条数据后返回,对Hbase集群也不会造成压力。并且输出到客户端对客户端也不会有太大压力

Filter pageSize = new PageFilter(pageSize *pageNo);

2.客户端分页技巧

            List<Result> resultList = new ArrayList<>();
            // 计算起始页和结束页
            Integer firstPage = (pageNo) *pageSize;
            Integer endPage = firstPage + pageSize;

            //客户端分页
            int i = 0;

            for (Result rs : scanner) {
                if (!rs.isEmpty() && i >= firstPage && i < endPage) {
                    resultList.add(rs);
                }
                if (resultList.size() == log.getPageSize()) {
                    break;
                }
                i++;
            }

这样就可以得到想要的分页效果了
完整代码:

    public static void mai(String[] args){
            Connection connection = HBaseClientUtil.getConnection();
            table = connection.getTable(TableName.valueOf(ProcessLogUtil.HB_TB_NAME));
            Scan scan = new Scan();
            Filter pageSizeFilter = new PageFilter(pageSize *pageNo);
            scan.setFilter(pageSizeFilter );
            ResultScanner scanner = table.getScanner(scan);
            List<Result> resultList = new ArrayList<>();
            // 计算起始页和结束页
            Integer firstPage = (pageNo) *pageSize;
            Integer endPage = firstPage + pageSize;

            //客户端分页
            int i = 0;

            for (Result rs : scanner) {
                if (!rs.isEmpty() && i >= firstPage && i < endPage) {
                    resultList.add(rs);
                }
                if (resultList.size() == log.getPageSize()) {
                    break;
                }
                i++;
            }
    }
           

猜你喜欢

转载自blog.csdn.net/u013465194/article/details/83045177