文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

hbase分页查询实现

2024-04-02 19:55

关注

Hbase本身是没有分页查询的,我在网上找了很多资料来实现一个分页功能,在这里做了一下记录,分享给大家,有什么不足之处,请尽管指出。废话不多说,看代码。

import java.io.IOException;

import java.util.LinkedHashMap;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

 

import org.apache.commons.lang.StringUtils;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.HTableInterface;

import org.apache.hadoop.hbase.client.HTablePool;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;

import org.apache.hadoop.hbase.filter.Filter;

import org.apache.hadoop.hbase.filter.FilterList;

import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;

import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;

import org.apache.hadoop.hbase.util.Bytes;

 

publicclass HBaseUtils {

    privatestatic Configuration config = null;

    privatestatic HTablePool tp = null;

    static {

        // 加载集群配置

        config = HBaseConfiguration.create();

        config.set("hbase.zookeeper.quorum", "xx.xx.xx");

        config.set("hbase.zookeeper.property.clientPort", "2181");

        // 创建表池(可伟略提高查询性能,具体说明请百度或官方API)

        tp = new HTablePool(config, 10);

    }

 

   

    publicstatic HTableInterface getTable(StringtableName) {

 

        if (StringUtils.isEmpty(tableName))

            returnnull;

 

        returntp.getTable(getBytes(tableName));

    }

 

   

    publicstaticbyte[] getBytes(String str) {

        if (str == null)

            str= "";

 

        return Bytes.toBytes(str);

    }

 

   

    publicstatic TBData getDataMap(StringtableName, String startRow,

            StringstopRow, Integer currentPage, Integer pageSize)

            throws IOException {

        List<Map<String, String>>mapList = null;

        mapList = new LinkedList<Map<String,String>>();

 

        ResultScanner scanner = null;

        // 为分页创建的封装类对象,下面有给出具体属性

        TBData tbData = null;

        try {

            // 获取最大返回结果数量

            if (pageSize == null || pageSize == 0L)

                pageSize = 100;

 

            if (currentPage == null || currentPage == 0)

                currentPage = 1;

 

            // 计算起始页和结束页

            IntegerfirstPage = (currentPage - 1) * pageSize;

 

            IntegerendPage = firstPage + pageSize;

 

            // 从表池中取出HBASE表对象

            HTableInterfacetable = getTable(tableName);

            // 获取筛选对象

            Scanscan = getScan(startRow, stopRow);

            // 给筛选对象放入过滤器(true标识分页,具体方法在下面)

            scan.setFilter(packageFilters(true));

            // 缓存1000条数据

            scan.setCaching(1000);

            scan.setCacheBlocks(false);

            scanner= table.getScanner(scan);

            int i = 0;

            List<byte[]> rowList = new LinkedList<byte[]>();

            // 遍历扫描器对象, 并将需要查询出来的数据row key取出

            for (Result result : scanner) {

                String row = toStr(result.getRow());

                if (i >= firstPage && i< endPage) {

                    rowList.add(getBytes(row));

                }

                i++;

            }

 

            // 获取取出的row key的GET对象

            List<Get>getList = getList(rowList);

            Result[]results = table.get(getList);

            // 遍历结果

            for (Result result : results) {

                Map<byte[], byte[]> fmap = packFamilyMap(result);

                Map<String, String> rmap = packRowMap(fmap);

                mapList.add(rmap);

            }

 

            // 封装分页对象

            tbData= new TBData();

            tbData.setCurrentPage(currentPage);

            tbData.setPageSize(pageSize);

            tbData.setTotalCount(i);

            tbData.setTotalPage(getTotalPage(pageSize, i));

            tbData.setResultList(mapList);

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            closeScanner(scanner);

        }

 

        return tbData;

    }

 

    privatestaticint getTotalPage(int pageSize, int totalCount) {

        int n = totalCount / pageSize;

        if (totalCount % pageSize == 0) {

            return n;

        } else {

            return ((int) n) + 1;

        }

    }

 

    // 获取扫描器对象

    privatestatic Scan getScan(String startRow,String stopRow) {

        Scan scan = new Scan();

        scan.setStartRow(getBytes(startRow));

        scan.setStopRow(getBytes(stopRow));

 

        return scan;

    }

 

   

    privatestatic FilterList packageFilters(boolean isPage) {

        FilterList filterList = null;

        // MUST_PASS_ALL(条件 AND) MUST_PASS_ONE(条件OR)

        filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);

        Filter filter1 = null;

        Filter filter2 = null;

        filter1 = newFilter(getBytes("family1"), getBytes("column1"),

                CompareOp.EQUAL, getBytes("condition1"));

        filter2 = newFilter(getBytes("family2"), getBytes("column1"),

                CompareOp.LESS, getBytes("condition2"));

        filterList.addFilter(filter1);

        filterList.addFilter(filter2);

        if (isPage) {

            filterList.addFilter(new FirstKeyOnlyFilter());

        }

        return filterList;

    }

 

    privatestatic Filter newFilter(byte[] f, byte[] c, CompareOp op, byte[] v) {

        returnnew SingleColumnValueFilter(f, c, op,v);

    }

 

    privatestaticvoid closeScanner(ResultScannerscanner) {

        if (scanner != null)

            scanner.close();

    }

 

   

    privatestatic Map<String, String>packRowMap(Map<byte[], byte[]> dataMap) {

        Map<String, String> map = new LinkedHashMap<String, String>();

 

        for (byte[] key : dataMap.keySet()) {

 

            byte[] value = dataMap.get(key);

 

            map.put(toStr(key), toStr(value));

 

        }

        return map;

    }

 

   

    privatestatic List<Get> getList(List<byte[]> rowList) {

        List<Get> list = new LinkedList<Get>();

        for (byte[] row : rowList) {

            Getget = new Get(row);

 

            get.addColumn(getBytes("family1"), getBytes("column1"));

            get.addColumn(getBytes("family1"), getBytes("column2"));

            get.addColumn(getBytes("family2"), getBytes("column1"));

            list.add(get);

        }

        return list;

    }

 

   

    privatestatic Map<byte[], byte[]> packFamilyMap(Result result){

        Map<byte[], byte[]> dataMap = null;

        dataMap = new LinkedHashMap<byte[], byte[]>();

        dataMap.putAll(result.getFamilyMap(getBytes("family1")));

        dataMap.putAll(result.getFamilyMap(getBytes("family2")));

        return dataMap;

    }

 

    privatestatic String toStr(byte[] bt) {

        return Bytes.toString(bt);

    }

 

    publicstaticvoid main(String[] args) throws IOException {

        // 拿出row key的起始行和结束行

        // #<0<9<:

        String startRow = "aaaa#";

        String stopRow = "aaaa:";

        int currentPage = 1;

        int pageSize = 20;

        // 执行hbase查询

        getDataMap("table", startRow, stopRow, currentPage,pageSize);

 

    }

}

 

class TBData {

    private Integer currentPage;

    private Integer pageSize;

    private Integer totalCount;

    private Integer totalPage;

    private List<Map<String, String>> resultList;

 

    public Integer getCurrentPage() {

        returncurrentPage;

    }

 

    publicvoid setCurrentPage(IntegercurrentPage) {

        this.currentPage = currentPage;

    }

 

    public Integer getPageSize() {

        returnpageSize;

    }

 

    publicvoid setPageSize(Integer pageSize) {

        this.pageSize = pageSize;

    }

 

    public Integer getTotalCount() {

        returntotalCount;

    }

 

    publicvoid setTotalCount(Integer totalCount){

        this.totalCount = totalCount;

    }

 

    public Integer getTotalPage() {

        returntotalPage;

    }

 

    publicvoid setTotalPage(Integer totalPage) {

        this.totalPage = totalPage;

    }

 

    public List<Map<String, String>> getResultList() {

        returnresultList;

    }

 

    publicvoidsetResultList(List<Map<String, String>> resultList) {

        this.resultList = resultList;

    }

}


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯