溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

hbase分頁查詢實(shí)現(xiàn)

發(fā)布時(shí)間:2020-08-08 21:59:25 來源:網(wǎng)絡(luò) 閱讀:4620 作者:乂枯乂 欄目:關(guān)系型數(shù)據(jù)庫

Hbase本身是沒有分頁查詢的,我在網(wǎng)上找了很多資料來實(shí)現(xiàn)一個(gè)分頁功能,在這里做了一下記錄,分享給大家,有什么不足之處,請盡管指出。廢話不多說,看代碼。

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");

        // 創(chuàng)建表池(可偉略提高查詢性能,具體說明請百度或官方API)

        tp = new HTablePool(config, 10);

    }

 

    /*

     * 獲取hbase的表

     */

    publicstatic HTableInterface getTable(StringtableName) {

 

        if (StringUtils.isEmpty(tableName))

            returnnull;

 

        returntp.getTable(getBytes(tableName));

    }

 

    /* 轉(zhuǎn)換byte數(shù)組 */

    publicstaticbyte[] getBytes(String str) {

        if (str == null)

            str= "";

 

        return Bytes.toBytes(str);

    }

 

    /**

     * 查詢數(shù)據(jù)

     * @param tableKey 表標(biāo)識

     * @param queryKey 查詢標(biāo)識

     * @param startRow 開始行

     * @param paramsMap 參數(shù)集合

     * @return結(jié)果集

     */

    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;

        // 為分頁創(chuàng)建的封裝類對象,下面有給出具體屬性

        TBData tbData = null;

        try {

            // 獲取最大返回結(jié)果數(shù)量

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

                pageSize = 100;

 

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

                currentPage = 1;

 

            // 計(jì)算起始頁和結(jié)束頁

            IntegerfirstPage = (currentPage - 1) * pageSize;

 

            IntegerendPage = firstPage + pageSize;

 

            // 從表池中取出HBASE表對象

            HTableInterfacetable = getTable(tableName);

            // 獲取篩選對象

            Scanscan = getScan(startRow, stopRow);

            // 給篩選對象放入過濾器(true標(biāo)識分頁,具體方法在下面)

            scan.setFilter(packageFilters(true));

            // 緩存1000條數(shù)據(jù)

            scan.setCaching(1000);

            scan.setCacheBlocks(false);

            scanner= table.getScanner(scan);

            int i = 0;

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

            // 遍歷掃描器對象, 并將需要查詢出來的數(shù)據(jù)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);

            // 遍歷結(jié)果

            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();

    }

 

    /**

     * 封裝每行數(shù)據(jù)

     */

    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;

    }

 

    /* 根據(jù)ROW KEY集合獲取GET對象集合 */

    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的起始行和結(jié)束行

        // #<0<9<:

        String startRow = "aaaa#";

        String stopRow = "aaaa:";

        int currentPage = 1;

        int pageSize = 20;

        // 執(zhí)行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;

    }

}


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI