2014-09-16 1 views
0

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

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, чтобы объединить это с тремя (тройными, col), весовыми) тройками, сгенерированными вашим вызовом mapTriplets. (Так что, не думайте об этом как обновляя в tempMatrix, а совмещая два РДУ, чтобы получить третий.)

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

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

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

+0

спасибо. я определенно должен более подробно рассмотреть, как работают RDD. Я попытаюсь это сделать и вернусь к вам, и, возможно, обновите свой ответ с помощью некоторого примера кода. Благодаря! – crockpotveggies

Смежные вопросы