使用 GraphFrame 迭代 GraphTraversal 会导致 UnsupportedOperationException Row 到 Vertex 转换
Iterating a GraphTraversal with GraphFrame causes UnsupportedOperationException Row to Vertex conversion
以下
GraphTraversal<Row, Edge> traversal = gf().E().hasLabel("foo").limit(5);
while (traversal.hasNext()) {}
导致以下异常:
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)
异常说要使用 .df().collect()
但 gf().E().hasLabel("foo")
不允许您之后使用 .df()
。换句话说,方法 df()
不存在 hasLabel()
返回的对象
我正在通过 dse-graph-frames:5.1.4
和 dse-byos_2.11:5.1.4
使用 Java API。
简短的回答:您需要将 GraphTraversal 转换为具有 df() 方法的 DseGraphTraversal。然后使用其中一种 spark Dataset 方法来收集行:
List<Row> rows =
((DseGraphTraversal)graph.E().hasLabel("foo"))
.df().limit(5).collectAsList();
DseGraphFrame 尚不支持完整的 TinkerPop 规范。所以你不能接收 TinkerPop Vertex 或 Edge 对象。 (limit()
方法在 DSE 5 中也未实现。1.x)。建议切换到spark dataset api with df() call, get Dataset<Row>
并使用Dataset base filtering and collecting
如果您只需要 Edge/Vertex 个属性,您仍然可以使用 TinkerPop valueMap()
或 values()
GraphTraversal<Row, Map<String,Object>> traversal = graph.E().hasLabel("foo").valueMap();
while (traversal.hasNext()) {}
以下
GraphTraversal<Row, Edge> traversal = gf().E().hasLabel("foo").limit(5);
while (traversal.hasNext()) {}
导致以下异常:
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)
异常说要使用 .df().collect()
但 gf().E().hasLabel("foo")
不允许您之后使用 .df()
。换句话说,方法 df()
不存在 hasLabel()
我正在通过 dse-graph-frames:5.1.4
和 dse-byos_2.11:5.1.4
使用 Java API。
简短的回答:您需要将 GraphTraversal 转换为具有 df() 方法的 DseGraphTraversal。然后使用其中一种 spark Dataset 方法来收集行:
List<Row> rows =
((DseGraphTraversal)graph.E().hasLabel("foo"))
.df().limit(5).collectAsList();
DseGraphFrame 尚不支持完整的 TinkerPop 规范。所以你不能接收 TinkerPop Vertex 或 Edge 对象。 (limit()
方法在 DSE 5 中也未实现。1.x)。建议切换到spark dataset api with df() call, get Dataset<Row>
并使用Dataset base filtering and collecting
如果您只需要 Edge/Vertex 个属性,您仍然可以使用 TinkerPop valueMap()
或 values()
GraphTraversal<Row, Map<String,Object>> traversal = graph.E().hasLabel("foo").valueMap();
while (traversal.hasNext()) {}