1

我正在尝试使用 Scala API 在图形上运行连接组件算法,如编程指南和其他示例中所示。

val graph = Graph.fromDataSet(vertices, edges, env).getUndirected
val maxIterations = 10
val components = graph.run(new ConnectedComponents(maxIterations))

我收到以下错误:

Type mismatch, expected: GraphAlgorithm[Long,String,Long,NotInferedT], actual: ConnectedComponents[Nothing,Nothing]

即使我添加

val components = graph.run(new ConnectedComponents[Long,String,Long](maxIterations))

我得到:

Type mismatch, expected: GraphAlgorithm[Long,String,Long,NotInferedT], actual: ConnectedComponents[Long,String]

我的进口是这些:

import org.apache.flink.api.scala._
import org.apache.flink.graph.library.ConnectedComponents
import org.apache.flink.graph.{Vertex, Edge}
import org.apache.flink.graph.scala.Graph

有人可以解释为什么会这样吗?

4

4 回答 4

1

问题是ConnectedComponents实现期望顶点具有java.lang.Long顶点值。不幸的是,scala.Long并且java.lang.Long类型不兼容。因此,为了使用该算法,您的vertices数据集必须是任意键类型的类型DataSet[K, java.lang.Long]K

于 2016-02-05T09:31:19.373 回答
1

GellyConnectedComponents库算法有 2 个类型参数,顶点 ID 类型和边值类型,因此您需要像这样调用它graph.run(new ConnectedComponents[Long, NullValue](maxIterations)。此外,由于它是 Java 实现,因此请确保导入java.lang.Long. 您还可以查看org.apache.flink.graph.scala.example.ConnectedComponents哪个使用 GSA 版本的库算法。

于 2016-02-05T10:27:17.977 回答
0

这看起来像是典型的 java/scala 类型不匹配。在这种情况下,请再次检查您是使用 java.lang.Long 还是 scala.Long。

于 2016-02-05T08:47:22.237 回答
0

vasia 和 Till Rohrmann 是对的,但在我的例子中,整个问题回溯到顶点和边的创建,而不仅仅是连接组件算法的使用。我正在使用 scala.Long 而不是 java.lang.Long 创建顶点和边。

于 2016-02-05T20:21:46.867 回答