HBase伪快速分页查询

发布时间:2017-6-29 10:35:51编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"HBase伪快速分页查询",主要涉及到HBase伪快速分页查询方面的内容,对于HBase伪快速分页查询感兴趣的同学可以参考一下。


    之前有两个功能,都是查询历史数据的一个分页查询,系统刚上线的时候,没有太多的数据,就一直扔在mysql里面,后来里面数据上亿之后,就查不到了,而且数据还在以指数级增长方式上报,后来,这部分业务单独迁移到hbase集群去存放,之前页面的查询也改查hbase了。但是hbase对分页查询这种东西支持不好,如果按照以往查询mysql的思路,查询出一个总的count,再查询出这一页的数据,这种方式去查询hbase,那么如果你仔细去跟代码计算时间的话,你会发现hbase去查count,无论哪种方式,都会引起全表扫描,是非常慢的。整个页面加载出来,看了下响应事件,大概要45s,等的我都喝了两杯茶了。


   so,我想了个比较伪的分页查询方法,去掉查询count操作,值查询一页数据:


 

public Page<BatteryData> findBatterHisData(BatteryHisDto dto)throws Exception {
        Page<BatteryData> dataPage=new Page<BatteryData>();
        List<BatteryData> dataList=new ArrayList<>();
        int totalSize=0;
        Table table=runner.getTable(tableName);
        Scan dataScan=new Scan();
        ResultScanner dataScanner=null;
        List<Filter> dataFilters = new ArrayList<Filter>();
        if(StringUtils.isNotBlank(dto.getBatteryNo())){//电池组编号过滤
            Filter filter=new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(dto.getBatteryNo()+"_"));
            dataFilters.add(filter);
        }
        Filter pageFilter=new PageFilter(dto.getPage()+dto.getPageSize());
        dataFilters.add(pageFilter);
        FilterList dataFilterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, dataFilters);
        dataScan.setFilter(dataFilterList);
        dataScanner=table.getScanner(dataScan);
        dataList= rsh.handle(tableName,dataScanner);
        if(dataList==null || dataList.size()<1){
            dataPage.setTotalCount(0);
            dataPage.setResult(null);
            return dataPage;
        }
        int startNo = dto.getPage();
        int endNo=startNo+dto.getPageSize();
        dataPage.setTotalCount(dto.getPage()+dto.getPageSize()+1);
        dataPage.setResult(dataList.subList(startNo,endNo));
        table.close();
        return dataPage;
	}




     因为用户关注的,通常是前几页的数据,所有我每次查询的时候,返回总页数,都返回个随便的数(跟前端的分页表格配合,实际上,我的前端只提供了上下分页,哈哈),然后查询有限条的数据,通常hbase表都是上亿甚至是百亿的,所以,用户时不太可能通过只点击上一页下一页,这样点到我最后一页的,可以放心了。最多他点个几千页,也就手疼到不行了。这样下来,响应速度控制在800ms内,无压力。


    PS,看到很多网友通过rowkey去做分页,具体思路是,每次记录下起始的rowkey和结束的rowkey,然后根据rowkey搜索,这样也是很快的,个人认为,也ok。



   


上一篇:Java 8 中 Date与LocalDateTime、LocalDate、LocalTime互转
下一篇:解决inline

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。