Как я могу получить доступ к значениям вне цикла Spark GraphX ​​.map?

Совершенно новый для Apache Spark, и я немного запутался, как делать обновления для значения, которое находится за пределами .mapTriplets итерация в GraphX. Увидеть ниже:

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 это график СДР

1 ответ

Решение

Вы могли бы сделать tempMatrix типа RDD[((Int,Int), Double)] - то есть каждая запись является парой, где первый элемент, в свою очередь, является (row,col) пара. Затем используйте класс PairRDDFunctions, чтобы объединить его с ((row,col),weight) триплетами, сгенерированными вашим mapTriplets вызов. (Таким образом, не думайте об этом как об обновлении tempMatrix, а скорее комбинируйте два RDD, чтобы получить третий.)

Если вам нужно поддерживать стационарные графы распределения, в которых имеется более одного ребра на пару вершин, это будет немного сложнее: вам, вероятно, нужно будет объединить эти ребра в сокращающем проходе, чтобы создать СДР с одной записью на пару со списком веса, а затем применить все веса к данной паре (строка, столбец) одновременно. В противном случае это очень просто.

Обратите внимание, что PairRDDFunctions, с одной стороны, дают вам возможность объединить несколько RDD в один или, с другой стороны, вывести значения в карту на главном устройстве. Предполагая, что матрица распределения достаточно велика, чтобы в первую очередь заслуживать СДР, я думаю, что вы должны сделать все это на СДР.

Другой подход заключается в том, чтобы сделать tempMatrix также GraphRDD, что может иметь или не иметь смысла в зависимости от того, что вы собираетесь делать с ним дальше.

Другие вопросы по тегам