Объявление пустого массива типа Edge Graphx - PullRequest
0 голосов
/ 05 мая 2018

Я читаю данные из файла для создания ребер графа. Я объявил массив и добавил ребра по одному. Этот код работает нормально:

class AIRecipes() 
case class edgeProperty(val relation: String, val usedIn: String) extends AIRecipes

var edgeArray = Array(Edge(0L, 0L, edgeProperty("", "")))
edgeArray = edgeArray ++ Array(Edge(VertexId, VertexId, edgeProperty("", "")) )

Но в первой строке вместо объявления дополнительного ребра с фиктивными значениями я хочу объявить пустой массив следующим образом:

var edgeArray = Array.empty[Edge[(Long, Long, Object)]]
edgeArray = edgeArray ++ Array(Edge(VertexId, VertexId, edgeProperty("", "")) )

Но это дает мне следующую ошибку компиляции на '++':

несоответствие типов; найдено: массив [org.apache.spark.graphx.Edge [_>: (Long, Long, Object) с net.sansa_stack.template.spark.rdf.TripleReader.edgeProperty <: Продукт с сериализуемым]] требуется: Array [org.apache.spark.graphx.Edge [(Long, Long, Object)]] Примечание. org.apache.spark.graphx.Edge [_>: (Long, Long, Object) с net.sansa_stack.template.spark.rdf.TripleReader.edgeProperty <: Продукт с сериализуемым]>: org.apache.spark.graphx.Edge [(Long, Long, Object)], но класс Array инвариантен в типе T. Вы можете пожелать исследовать подстановочный тип, такой как _ >: org.apache.spark.graphx.Edge[(Long, Long, Object)].

Я тоже пробовал это:

edgeArray :+ Array(Edge(VertexId, VertexId, edgeProperty("", "")) )

Это не дает мне ошибки компиляции, но в массив ничего не добавляется.

1 Ответ

0 голосов
/ 06 мая 2018

Тип первого массива неверен. Обратите внимание, что Edge параметризуется только своим свойством, поэтому тип выражения, которое вы пытаетесь объединить, - Array[Edge[edgeProperty]]:

scala> :t Array(Edge(0L, 0L, edgeProperty("", "")))
Array[org.apache.spark.graphx.Edge[edgeProperty]]

пока вы определяете переменную как Array.empty[Edge[(Long, Long, Object)]].

Часть Object является второй проблемой. Как вы можете прочитать в сообщении об исключении, Array (как и любой другой изменяемый контейнер) является инвариантом. Так что если вы действительно хотите перейти с Object, вам придется:

scala> var edgeArray = Array.empty[Edge[Object]]
edgeArray: Array[org.apache.spark.graphx.Edge[Object]] = Array()

scala> edgeArray = edgeArray ++ (Array(Edge(1L, 2L, edgeProperty("", "")) ): Array[Edge[Object]])
edgeArray: Array[org.apache.spark.graphx.Edge[Object]] = [Lorg.apache.spark.graphx.Edge;@338

но я все еще рекомендую

scala> var edgeArray = Array.empty[Edge[edgeProperty]]
edgeArray: Array[org.apache.spark.graphx.Edge[edgeProperty]] = Array()

scala> edgeArray = edgeArray ++ Array(Edge(1L, 2L, edgeProperty("", "")) )
edgeArray: Array[org.apache.spark.graphx.Edge[edgeProperty]] = [Lorg.apache.spark.graphx.Edge;@7d59e8d4
...