0

全新的 Apache Spark,我有点困惑如何更新.mapTripletsGraphX 中迭代之外的值。见下文:

def mapTripletsMethod(edgeWeights: Graph[Int, Double], stationaryDistribution: Graph[Double, Double]) = {
  val tempMatrix: SparseDoubleMatrix2D = graphToSparseMatrix(edgeWeights)

  stationaryDistribution.mapTriplets{ e =>
      val row = e.srcId.toInt
      val column = e.dstId.toInt
      var cellValue = -1 * tempMatrix.get(row, column) + e.dstAttr
      tempMatrix.set(row, column, cellValue) // this doesn't do anything to tempMatrix
      e
    }
}

我猜这是由于 an 的设计,RDD并且没有简单的方法来更新tempMatrix值。当我运行上面的代码时,该tempMatrix.set方法什么也不做。尝试在调试器中跟踪问题是相当困难的。

有没有人有一个简单的解决方案?谢谢!

编辑

我在上面进行了更新以显示这stationaryDistribution是一个图表 RDD。

4

1 回答 1

1

您可以使 tempMatrix 成为类型RDD[((Int,Int), Double)]——也就是说,每个条目都是一对,其中第一个元素又是(row,col)一对。然后使用PairRDDFunctions类将其与mapTriplets调用生成的 ((row,col),weight) 三元组结合起来。(因此,不要将其视为更新tempMatrix,而是将两个 RDD 组合起来获得第三个。)

如果您需要支持每个顶点对有多个边的静态分布图,这会有点棘手:您可能需要在归约过程中组合这些边以创建一个 RDD,每对有一个条目,并带有一个列表权重,然后将所有权重同时应用于给定的 (row,col) 对。否则很简单。

请注意,“PairRDDFunctions”一方面为您提供了将多个 RDD 组合为一个的方法,或者另一方面将值拉出到 master 上的 Map 中。假设分布矩阵足够大,首先值得一个 RDD,我认为你应该在 RDD 上做所有事情。

另一种方法是使 tempMatrix 也成为 GraphRDD,这可能有意义,也可能没有意义,具体取决于您接下来要使用它做什么。

于 2014-09-17T00:48:53.027 回答