Cloudera CDH/CDP 및 Hadoop EcoSystem, Semantic IoT등의 개발/운영 기술을 정리합니다. gooper@gooper.com로 문의 주세요.
* 호출하는 쪽에서 사용하는 예시
if(paging) {
// pageNumber를 100개 이내로 제한한다.
if(pageNumber <= 0 || pageNumber >= 100) throw new NotProperRangeException("pageNumber is not in proper ranges(0 < pageNumber < 100)");
rows=StoreUtil.listScanWithPaging(conn, tableName,Bytes.toBytes(startRow),Bytes.toBytes(stopRow), pageNumber, pageSize);
} else {
// maxRows를 10000개 이내로 제한한다.
if(maxRows <= 0 || maxRows >= 10000) throw new NotProperRangeException("maxRows is not in proper ranges(0 < maxRows < 10000)");
rows=StoreUtil.listScan(conn, tableName,Bytes.toBytes(startRow),Bytes.toBytes(stopRow),maxRows);
}
------------------------------StoreUtil.java에 포함되는 메서드중 일부 --------------------------------
// scan with paging
static public List<Map<String, byte[]>> listScanWithPaging(HConnection conn, String tableName, byte[] startRow, byte[] stopRow, int pageNumber, int pageSize) throws Exception {
HTableInterface table = null;
try {
table=conn.getTable(Bytes.toBytes(tableName));
Scan scan=new Scan(startRow);
if(stopRow!=null)
scan.setStopRow(stopRow);
ResultScanner scanner = table.getScanner(scan);
List<Map<String, byte[]>> rows=new LinkedList<Map<String, byte[]>>();
int skipCnt = 1;
int rowCnt = 1;
// 잘못된 값이 들어오면 0건 return
if(pageNumber <= 0 || pageSize <= 0) return rows;
if(pageNumber == 1) pageNumber = 2;
try {
for (Result rs : scanner) {
if(skipCnt++ <= ((pageNumber-1) * pageSize)) {
//System.out.println("skipCnt == > ["+(skipCnt-1)+"]");
continue;
} else {
//System.out.println("includeCnt == > ["+(skipCnt-1)+"]");
}
// 지정한 수만큼 row를 뽑아냄
if(rowCnt++ > pageSize) break;
Map<String, byte[]> m=new LinkedHashMap<String, byte[]>();
m.put("rowId", rs.getRow());
NavigableMap<byte[], NavigableMap<byte[], byte[]>> familyQualifierMap = rs.getNoVersionMap();
for (byte[] familyBytes : familyQualifierMap.keySet()) {
NavigableMap<byte[], byte[]> qualifierMap = familyQualifierMap.get(familyBytes);
for (byte[] qualifier : qualifierMap.keySet())
m.put(Bytes.toString(qualifier), qualifierMap.get(qualifier));
}
rows.add(m);
}
} finally {
scanner.close();
}
return rows;
} finally {
if(table!=null)table.close();
}
}
// count
static public long getCount(HConnection conn, String tableName, String startRow, String stopRow) throws Exception {
HTableInterface table = null;
try {
if(startRow == null || startRow.equals("")) throw new NullPointerException("startRow is null or '' ");
if(stopRow == null || stopRow.equals("")) throw new NullPointerException("stopRow is null or '' ");
table=conn.getTable(Bytes.toBytes(tableName));
Scan scan=new Scan(Bytes.toBytes(startRow));
if(stopRow!=null)
scan.setStopRow(Bytes.toBytes(stopRow));
ResultScanner scanner = table.getScanner(scan);
long cnt=0L;
try {
for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
cnt++;
}
} finally {
scanner.close();
}
return cnt;
} finally {
if(table!=null)table.close();
}
}