【问题标题】:Pagination for Reading Titan Vertex from HBase从 HBase 读取 Titan Vertex 的分页
【发布时间】:2013-07-03 09:41:48
【问题描述】:

我目前正在创建一个可以从 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 返回整个 Graph。

currentOffSet 是一个确定当前页码的 int 变量。

我也尝试了 ResultScanner#next(int rowCount)。它工作正常。但在这个过程中,我没有返回上一页的选项。

谁能帮帮我?

提前谢谢你。

【问题讨论】:

    标签: hbase titan


    【解决方案1】:

    我已经解决了。逻辑很简单。您必须在扫描仪实例上使用 setStartRow 方法。第一次没有必要,因为扫描应该从第一行开始。然后我们需要获取 *(PAGE_SIZE+1)* 行数。 ResultScanner 的最后一行将用作下一页的起始行。

    为了返回上一页,我们需要使用缓冲区或堆栈来存储所有先前访问过的页面的起始行

    这是我的代码 sn-p :

        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 & currentPageStartRowForHBasebyte[]

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

    【讨论】:

    • 我刚开始评估 Titan,我的理解是曾经无法直接从 Hbase 读取/写入 Titan 图数据。看起来你在说这是可能的。您能否指出可以向我展示如何做到这一点的示例?
    • 上面的代码是你所问的最简单的例子。 List vertexList 是我用来保存顶点的集合。 IDHandler.getKeyID(byteBuffer) 这行实际上是从 HBase 后端返回顶点 id。现在,一旦我获得了顶点 id,获得顶点实例并不复杂。我需要的是一种从 HBase 后端和 Cassandra 读取数据的简单方法,因为 Titan 不支持全局查询。如果您想要一种更好的方式从 HBase 或 Cassandra 读取数据,您绝对可以通过探索后端功能来实现。
    猜你喜欢
    • 2017-04-28
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2018-11-14
    • 2017-10-13
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多