1. 程式人生 > >Hbase Filter+Scan 查詢效率優化

Hbase Filter+Scan 查詢效率優化

Hbase Filter+Scan 查詢效率問題

眾所周知,Hbase利用filter過濾器查詢時候會進行全表掃描,查詢效率低下,如果沒有二級索引,在專案中很多情況需要利用filter,下面針對這種情況嘗試了幾種優化的方案,僅供參考,歡迎交流。

根據業務要求,作者需要根據時間範圍搜尋所需要的資料,所以作者設計的rowKey是以時間戳為起始字串的。

正確嘗試:
1.scan 設定 開始行和結束行

            Scan scan = new Scan();
            scan.setStartRow("startRowKey".getBytes());
            scan.setStopRow("stopRowKey".getBytes());

結論:查詢效率明顯提升

2.查詢的數量越小越好
總資料量越大,查詢越耗時,所以為保證效率,開始行和結束行之間需要遍歷的資料總量越少越好。

需要說明的是,在filter 中RowFilter設定開始行(字首)和結束行(字首)
並不能提升查詢效率,因為還是全表掃描。

        FilterList filters = new FilterList(FilterList.Operator.MUST_PASS_ALL);
        //開頭大於等於starTm的行
      
         Filter starTime = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
                   new BinaryPrefixComparator(DateUtil.formatDate(starTime, "yyyyMMddHHmmssSSS").getBytes()));
         filters.addFilter(starTime);
      

        //開頭小於等於endTime的行
        
          Filter endTime = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
                    new BinaryPrefixComparator(DateUtil.formatDate(endTime, "yyyyMMddHHmmssSSS").getBytes()));
          filters.addFilter(endTime);
       

結論:利用san+filter方式查詢hbase時,一定要設定starRow 和stopRow