从HBase阅读Titan Vertex的分页

时间:2013-07-03 09:41:49

标签: hbase titan

我目前正致力于创建一个可以从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)。它工作正常。但在这个过程中,我没有选择返回上一页。

任何人都可以帮助我吗?

提前谢谢。

1 个答案:

答案 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 []

这满足了我的要求。但如果有人有任何更好的解决方案,请与我们分享。