Iterating a GraphTraversal with GraphFrame causes UnsupportedOperationException Row to Vertex conversion

北慕城南 提交于 2019-12-11 12:08:01

问题


The following

    GraphTraversal<Row, Edge> traversal = gf().E().hasLabel("foo").limit(5);
    while (traversal.hasNext()) {}

causes the following Exception:

java.lang.UnsupportedOperationException: Row to Vertex conversion is not supported: Use .df().collect() instead of the iterator

    at com.datastax.bdp.graph.spark.graphframe.DseGraphTraversal.iterator$lzycompute(DseGraphTraversal.scala:92)
    at com.datastax.bdp.graph.spark.graphframe.DseGraphTraversal.iterator(DseGraphTraversal.scala:78)
    at com.datastax.bdp.graph.spark.graphframe.DseGraphTraversal.hasNext(DseGraphTraversal.scala:129)

Exception says to use .df().collect() but gf().E().hasLabel("foo") does not allow you to do .df() afterwards. In other words, method df() is not there for object returned by hasLabel()

I'm using the Java API via dse-graph-frames:5.1.4 along with dse-byos_2.11:5.1.4.


回答1:


The short answer: You need to cast GraphTraversal to DseGraphTraversal that has df() method. Then use one of spark Dataset methods to collect Rows:

List<Row> rows =
   ((DseGraphTraversal)graph.E().hasLabel("foo"))
   .df().limit(5).collectAsList();

DseGraphFrame does not yet support full TinkerPop specification. So you can not receive TinkerPop Vertex or Edge objects. ( limit() method is also not implemented in DSE 5.1.x). It is recommended to switch to spark dataset api with df() call, get Dataset<Row> and use Dataset base filtering and collecting

If you need only Edge/Vertex properties you still can use TinkerPop valueMap() or values()

    GraphTraversal<Row, Map<String,Object>> traversal = graph.E().hasLabel("foo").valueMap();
    while (traversal.hasNext()) {}


来源:https://stackoverflow.com/questions/48316620/iterating-a-graphtraversal-with-graphframe-causes-unsupportedoperationexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!