2016-02-04 76 views
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 

是否有人可以解释为什么发生这种情况?

回答

1

ConnectedComponents冻膜库算法需要2个型参数,顶点ID类型和边缘值类型,所以需要这样称呼它例如graph.run(new ConnectedComponents[Long, NullValue](maxIterations)。另外,由于它是Java实现,因此请务必导入java.lang.Long。 您也可以查看使用库算法的GSA版本的org.apache.flink.graph.scala.example.ConnectedComponents

0

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

1

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

0

vasia和直到Rohrmann是正确的,但在我的情况下,整个问题回溯到创建顶点和边,而不仅仅是连接组件算法的使用情况。我使用scala.Long创建顶​​点和边,而不是java.lang.Long。