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。
答案 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,根据您接下来要做的事情,这可能有意义也可能没有意义。