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.

Другие вопросы по тегам