我正在尝试使用scalaapi在图形上运行connected components算法,如编程指南和其他示例中所示。
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条答案
按热度按时间k2fxgqgv1#
vasia和till rohrmann是对的,但在我的例子中,整个问题回到顶点和边的创建,而不仅仅是连接组件算法的使用。我使用scala.long而不是java.lang.long创建顶点和边。
ktca8awb2#
问题是
ConnectedComponents
实现期望顶点具有java.lang.Long
顶点值。不幸的是,scala.Long
以及java.lang.Long
类型不兼容。因此,为了使用该算法vertices
数据集的类型必须为DataSet[K, java.lang.Long]
与K
属于任意密钥类型。ygya80vv3#
这个
ConnectedComponents
gelly库算法接受两个类型参数,顶点id类型和边值类型,因此您需要像这样调用它graph.run(new ConnectedComponents[Long, NullValue](maxIterations)
. 另外,因为它是一个java实现,所以请确保导入java.lang.Long
. 你也可以看看org.apache.flink.graph.scala.example.ConnectedComponents
它使用了gsa版本的库算法。6yoyoihd4#
这看起来像是典型的java/scala类型不匹配。请再次检查在这种情况下是使用java.lang.long还是scala.long。