2015-03-21 2 views
3

Я создаю PairRDD, который содержит вектор.Apache Spark RDD - не обновляется

var newRDD = oldRDD.mapValues(listOfItemsAndRatings => Vector(Array.fill(2){math.random}))

Позже я обновить RDD:

newRDD.lookup(ratingObject.user)(0) += 0.2 * (errorRate(rating) * myVector)

Однако, несмотря на то, что выводит обновленный вектор (как показано на консоли), когда я в следующий раз позвонить newRDD я могу видеть Векторное значение изменилось. Через тестирование я пришел к выводу, что он изменился на то, что дается math.random - так как каждый раз я звоню newRDD Вектор меняется. Я понимаю, что есть граф линии, и, возможно, это имеет к этому какое-то отношение. Мне нужно обновить Vector, хранящийся в RDD, до новых значений, и мне нужно сделать это несколько раз.

Спасибо.

+1

новый RDD - это RDD и не подлежит определению по определению. Я думаю, вы не можете изменять значения внутри Vector в своем RDD. –

ответ

2

RDD - это неизменные структуры, предназначенные для распределения операций над данными по кластеру. В поведении вы наблюдаете два элемента:

RDD lineage может быть вычислен каждый раз. В этом случае это означает, что действие на newRDD может инициировать вычисление линии, поэтому применяя преобразование Vector(Array.fill(2){math.random}) и каждый раз получая новые значения. Линию можно сломать, используя cache, и в этом случае значение преобразования будет сохранено в памяти и/или диске после первого применения. Это приводит к:

val randomVectorRDD = oldRDD.mapValues(listOfItemsAndRatings => Vector(Array.fill(2){math.random})) 
randomVectorRDD.cache() 

Второй аспект, который нуждается в дальнейшем рассмотрении находится на месте мутации:

newRDD.lookup(ratingObject.user)(0) += 0.2 * (errorRate(rating) * myVector) 

Хотя это может работать на одной машине, поскольку все векторные ссылки являются локальными, то это будет не масштабируются для кластера, поскольку ссылки на поиск будут сериализованы, и мутации не будут сохранены. Поэтому возникает вопрос, зачем использовать Spark для этого.

Для реализации на Spark этот алгоритм нуждается в перепроектировании, чтобы быть выраженным в терминах преобразований вместо пунктуального поиска/мутаций.

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