Hbase Filter+Scan 查詢效率優化
阿新 • • 發佈:2018-12-15
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