【问题标题】:How can I access values outside of Spark GraphX .map loop?如何访问 Spark GraphX .map 循环之外的值?
【发布时间】:2014-11-10 19:09:08
【问题描述】:

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。

【问题讨论】:

    标签: multithreading scala apache-spark colt rdd


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您。我绝对需要仔细研究 RDD 的功能。我将尝试这个并回复你,也许用一些示例代码更新你的答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多