Flink:Connected Components - 类型不匹配错误

Posted

技术标签:

【中文标题】Flink:Connected Components - 类型不匹配错误【英文标题】:Flink: Connected Components - type mismatch error 【发布时间】:2016-02-04 17:36:02 【问题描述】:

我正在尝试使用 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

谁能解释一下为什么会这样?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Flink:Connected Components - 类型不匹配错误的主要内容,如果未能解决你的问题,请参考以下文章

Connected Component in Undirected Graph

[LintCode] Connected Component in Undirected Graph

lintcode431- Connected Component in Undirected Graph- medium

LintCode Find the Weak Connected Component in the Directed Graph

Find the Weak Connected Component in the Directed Graph

[React] Refactor a connected Redux component to use Unstated