声明Edge Graphx类型的空数组

时间:2018-05-05 09:29:13

标签: arrays scala apache-spark spark-graphx

我正在从文件中读取数据以创建图形边缘。我已经声明了一个数组并逐个添加边。这段代码工作正常:

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("", "")) )

但是它给了我关于'++'的编译错误:

  

类型不匹配; found:Array [org.apache.spark.graphx.Edge [_>:   (长,长,对象)用   net.sansa_stack.template.spark.rdf.TripleReader.edgeProperty<:   需要序列化的产品]]:   数组[org.apache.spark.graphx.Edge [(Long,Long,Object)]]注意:   org.apache.spark.graphx.Edge [_> :( Long,Long,Object)with   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 :(得分:1)

第一个数组的类型不正确。请注意,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