java实现hbase分页,hbase 分页浏览实现

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 pagefiltMap = new HashMap();

private int pageSize;

public List 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 resultList = new ArrayList();

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;

}

}