Hbase本身是沒有分頁查詢的,我在網(wǎng)上找了很多資料來實現(xiàn)一個分頁功能,在這里做了一下記錄,分享給大家,有什么不足之處,請盡管指出。廢話不多說,看代碼。
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計、成都做網(wǎng)站與策劃設(shè)計,關(guān)嶺網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:關(guān)嶺等地區(qū)。關(guān)嶺做網(wǎng)站價格咨詢:028-86922220
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 Configurationconfig =null;
privatestatic HTablePooltp =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
mapList =new LinkedList
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;
//計算起始頁和結(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
Result[]results = table.get(getList);
//遍歷結(jié)果
for (Result result : results) {
Map<byte[],byte[]> fmap = packFamilyMap(result);
Map
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
Map
for (byte[] key : dataMap.keySet()) {
byte[] value = dataMap.get(key);
map.put(toStr(key), toStr(value));
}
return map;
}
/*根據(jù)ROW KEY集合獲取GET對象集合 */
privatestatic List
List
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 IntegercurrentPage;
private IntegerpageSize;
private IntegertotalCount;
private IntegertotalPage;
private List
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
returnresultList;
}
publicvoidsetResultList(List
this.resultList = resultList;
}
}