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<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;
		}
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章