如何访问Spark GraphX .map循环之外的值?

时间:2014-09-16 21:38:42

标签: multithreading scala apache-spark colt rdd

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

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
    }
}

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

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

修改

我上面做了一个更新,表明stationaryDistribution是图表RDD。

1 个答案:

答案 0 :(得分:1)

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

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

请注意`PairRDDFunctions'一方面为您提供了将多个RDD组合成一个RDD的方法,或者另一方面将值拉出到主服务器上的Map中。假设分布矩阵足够大,一开始就值得一个RDD,我认为你应该在RDD上完成整个过程。

另一种方法是使tempMatrix成为GraphRDD,根据您接下来要做的事情,这可能有意义也可能没有意义。