我目前正致力于创建一个可以从Hadoop HBase后端读取Titan Vertex From的Java代码。我知道blueprint api在每个TransactionalGraph上提供了一个getVertices()方法,但我仍在尝试实现我自己的方法。现在对于通常的顶点读取,我已经有了一个可以读取整个HBase后端并从Titan Graph中获取所有顶点的工作代码,但是我在实现分页时遇到了问题。
我的代码到目前为止:
Scan scan = new Scan();
Filter pageFilter = new ColumnPaginationFilter(DEFAULT_PAGE_SIZE, currentOffSet);
scan.setFilter(pageFilter);
scan.addFamily(Backend.EDGESTORE_NAME.getBytes());
scan.setMaxVersions(10);
List<Vertex> vertexList = new ArrayList<>(DEFAULT_PAGE_SIZE);
HTablePool pool = new HTablePool(config, DEFAULT_PAGE_SIZE);
ResultScanner scanner = pool.getTable(attributeMap.get("storage.tablename")).getScanner(scan);
但是ResultScanner返回整个图表。
currentOffSet 是一个int变量,用于确定当前页码。
我还尝试使用 ResultScanner#next(int rowCount)。它工作正常。但在这个过程中,我没有选择返回上一页。
任何人都可以帮助我吗?
提前谢谢。
答案 0 :(得分:0)
我已经解决了。逻辑非常简单。您必须在扫描程序实例上使用 setStartRow 方法。这是第一次没有必要,因为扫描应该从第一行开始。然后我们需要获取*(PAGE_SIZE + 1)*行数。 ResultScanner 的最后一行将用作下一页的起始行。
要返回上一页,我们需要使用缓冲区或堆栈来存储以前访问过的所有页面的起始行。
这是我的代码段:
Scan scan = (new Scan()).addFamily(Backend.EDGESTORE_NAME.getBytes());
Filter filter = new PageFilter(DEFAULT_PAGE_SIZE + 1);
scan.setFilter(filter);
if (currentPageStartRowForHBase != null) {
scan.setStartRow(currentPageStartRowForHBase);
}
List<Vertex> vertexList = new ArrayList<>(DEFAULT_PAGE_SIZE + 1);
HTablePool pool = null;
ResultScanner scanner = null;
try {
if (pool == null) {
pool = new HTablePool(config, DEFAULT_PAGE_SIZE + 1);
}
scanner = pool.getTable(attributeMap.get("storage.tablename")).getScanner(scan);
for (Result result : scanner) {
ByteBuffer byteBuffer = ByteBuffer.wrap(result.getRow());
Vertex vertex = this.getVertex(IDHandler.getKeyID(byteBuffer));
if (vertexList.size() < DEFAULT_PAGE_SIZE)
vertexList.add(vertex);
else {
nextPageStartRowForHBase = byteBuffer.array();
}
}
} catch (Exception e) {
e.printStackTrace();
}
nextPageStartRowForHBase &amp; currentPageStartRowForHBase 是 byte [] 。
这满足了我的要求。但如果有人有任何更好的解决方案,请与我们分享。