【问题标题】:Declaring an empty array of type Edge Graphx声明一个 Edge Graphx 类型的空数组
【发布时间】:2018-05-06 17:41:16
【问题描述】:

我正在从文件中读取数据以创建图形的边缘。我已经声明了一个数组并在其中一一添加边。此代码运行良好:

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[_ >: (长,长,对象)与 net.sansa_stack.template.spark.rdf.TripleReader.edgeProperty <: array 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("", "")) )

它没有给我编译错误,但没有在数组中添加任何内容。

【问题讨论】:

  • 你能把edgeProperty的签名贴出来吗?
  • @user9613318 edgeProperty 是一个类。 class AIRecipes(), case class edgeProperty(val relation: String, val usedIn: String) extends AIRecipes

标签: arrays scala apache-spark spark-graphx


【解决方案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

【讨论】:

  • 我将var edgeArray = Array.empty[Edge[(Long, Long, Object)]] 更改为var edgeArray = Array.empty[Edge[edgeProperty]],现在工作正常。谢谢:)
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多