Flink: подключенные компоненты - ошибка несоответствия типов
Я пытаюсь запустить алгоритм связанных компонентов на графике, используя 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 ответа
ConnectedComponents
Алгоритм библиотеки Gelly принимает 2 параметра типа: тип идентификатора вершины и тип значения ребра, поэтому вам нужно, например, назвать его так graph.run(new ConnectedComponents[Long, NullValue](maxIterations)
, Кроме того, поскольку это реализация Java, обязательно импортируйте java.lang.Long
, Вы также можете посмотреть на org.apache.flink.graph.scala.example.ConnectedComponents
который использует версию алгоритма библиотеки GSA.
Проблема в том, что ConnectedComponents
реализация ожидает, что вершины имеют java.lang.Long
значение вершины. К несчастью, scala.Long
а также java.lang.Long
не совместимы по типу. Таким образом, чтобы использовать алгоритм, ваш vertices
набор данных должен быть типа DataSet[K, java.lang.Long]
с K
быть произвольным типом ключа.
Это выглядит как типичное несоответствие типов java/scala. Пожалуйста, проверьте еще раз, используете ли вы java.lang.Long или scala.Long в этом случае.
vasia и Till Rohrmann были правы, но в моем случае вся проблема связана с созданием вершин и ребер, а не только с использованием алгоритма связанных компонентов. Я создавал вершины и ребра, используя scala.Long, а не java.lang.Long.