hbase 实现分页的关键仍然是rowkey的合理设计以及api的合理运用,与具体实现要求也相关
本例假设界面只有一个向上和向下按键的简单实现
1:设置私有变量保存当前浏览页的属性,当前页的首个rowkey,以及末尾的下一个rowkey
2:保存私有变量,存储该页的id,及对应的startrowkey
3:pagefilter的大小设置为分页大小+1
以上是实现的关键,当然如果想知道总页数,以及随机读取某一页,势必要遍历所有数据并缓存分页数据,得不偿失了
public class nextKey {
public int pagNum;// 页数
public boolean hasNext;// 是否有下一页
public boolean hasUpward;// 是否有上一页
public String lastRow;// 最后一个rowkey
public String firstRow;// 第一个rowkey
public nextKey() {
hasNext = false;
hasUpward = false;
lastRow = null;
firstRow = null;
// direction = 1;
pagNum = 1;
}
}
// 实现分页查询
// int direction ;//方向 1表示向下;2表示向上
private Map<Integer, String> pagefiltMap = new HashMap<Integer,String>();
private int pageSize;
public List<Result> getMsgByIpDate(String ip, String begin,
String end, int pageSize, int direction, nextKey nk) {
// long start = System.currentTimeMillis();
HTablePool tablePool = new HTablePool(conf, POOL_MAX_SIZE);
// 获取IP 所在的表名
HTable iptypeTable = (HTable) tablePool.getTable("iptype");
Get get = new Get(Bytes.toBytes(ip));
get.addColumn(Bytes.toBytes("type"), Bytes.toBytes("tablename"));
// get.setMaxVersions(1);
Result rs = null;
try {
rs = iptypeTable.get(get);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String logtableName = Bytes.toString(rs.getValue(Bytes.toBytes("type"),
Bytes.toBytes("tablename")));
HTable table = (HTable) tablePool.getTable(logtableName);
Scan scan = new Scan();
scan.addColumn(Bytes.toBytes("logmsg"), Bytes.toBytes("msg"));
if (nk.lastRow != null && direction == 1 && nk.hasNext == true) {
scan.setStartRow(Bytes.toBytes(nk.lastRow));
scan.setStopRow(Bytes.toBytes(ip + "_" + end + "`"));
nk.pagNum++;
} else if (nk.firstRow != null && direction == 2 && nk.pagNum > 1) {
scan.setStartRow(Bytes.toBytes(pagefiltMap.get(nk.pagNum-1)));
scan.setStopRow(Bytes.toBytes(nk.firstRow+"0x00"));//此处需要加上个结束符
nk.pagNum--;
} else {
scan.setStartRow(Bytes.toBytes(ip + "_" + begin + "_"));
scan.setStopRow(Bytes.toBytes(ip + "_" + end + "`"));
nk.pagNum = 1;
}
nk.hasNext = false;
nk.firstRow = null;
nk.lastRow = null;
// scan.setStopRow(Bytes.toBytes(ip + "_"+end + "`"));
scan.setCaching(100);
scan.setBatch(100);
Filter filter = new PageFilter(pageSize + 1);
scan.setFilter(filter);
int totalRows = 0;
ArrayList<Result> resultList = new ArrayList<Result>();
try {
ResultScanner rsResultScanner = table.getScanner(scan);
for (Result r : rsResultScanner) {
totalRows++;
if (totalRows == 1) {
nk.firstRow = Bytes.toString(r.getRow());
pagefiltMap.put(nk.pagNum, nk.firstRow);
}
if (totalRows > pageSize) {
nk.lastRow = Bytes.toString(r.getRow());
nk.hasNext = true;
}
// 返回行信息
else {
resultList.add(r);
}
}
rsResultScanner.close();
tablePool.close();
// long end1 = System.currentTimeMillis();
// System.out.println(start - end1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
return resultList;
}
}