Hbase查詢小結:先縮小範圍,再使用正則進行過濾

最近在作大數據分析結果的展現。宗旨:存進去,取出來,看似簡單其實不易。通過這幾天的不懈努力終於找到了中上等的hbase key的設計方式。 
key的設計:時間+類型一+類型二+(long的最大值-此條數據的value)+…… 
查詢代碼:正則表達式

/**
* 根據startRowKey和endRowKey篩選出區間,而後根據regxKey正則匹配和num查出最終的結果
* @param tableName 表名
* @param startRowKey 開始的範圍
* @param endRowKey 結束的範圍
* @param regxKey 正則匹配
* @param num 查詢的條數
* @return List<Result>
*/
public List<Result> getNumRegexRow(String tableName,String startRowKey,String endRowKey, String regxKey,int num) {
        HTableInterface table = null;
        List<Result> list = null;
        try {
            table = hTablePool.getTable(tableName) ;
            //建立一個過濾器容器,並設置其關係(AND/OR)
                FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL);
            //設置正則過濾器
            RegexStringComparator rc = new RegexStringComparator(regxKey);
            RowFilter rf = new RowFilter(CompareOp.EQUAL, rc);
            //過濾獲取的條數
            Filter filterNum = new PageFilter(num);//每頁展現條數
            //過濾器的添加
            fl.addFilter(rf);
            fl.addFilter(filterNum);
            Scan scan = new Scan();
            //設置取值範圍
            scan.setStartRow(startRowKey.getBytes());//開始的key
            scan.setStopRow(endRowKey.getBytes());//結束的key
            scan.setFilter(fl);//爲查詢設置過濾器的list
            ResultScanner scanner = table.getScanner(scan) ;
            list = new ArrayList<Result>() ;
            for (Result rs : scanner) {
                list.add(rs) ;
            }
        } catch (Exception e) {
            e.printStackTrace() ;
        }
        finally
        {
            try {
                table.close() ;

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return list;
    }

 

進行測試舉例:測試

List<Result> list = hbaseUtil.getNumRegexRow("student","201611241440vmhardware.disk.read.bps","201611241440vmhardware.disk.read.bpsA","201611241440vmhardware\\.disk\\.read\\.bps.*",100);

 

原理: 
①hbase會根據key值進行默認排序,因此咱們的數據會按先照時間排序,而後再按照類型一排序,再按照類型二排序,再按照value從大到小(你應該懂得~~)的方式排序。 
②範圍201611241440vmhardware.disk.read.bps到201611241440vmhardware.disk.read.bpsA是由於A比任意一個數字都大 
③201611241440vmhardware\.disk\.read\.bps.*表明你要根據需求拼成的正則表達式 
④100則是你所要取的數據的個數(從大到小)。大數據

相關文章
相關標籤/搜索