Apache Spark RDD - 不更新

时间:2015-03-21 01:25:59

标签: scala apache-spark rdd

我创建了一个包含Vector的PairRDD。

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

稍后我更新了RDD:

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

但是,虽然它输出了更新的Vector(如控制台中所示),但当我下次调用newRDD时,我可以看到Vector值已更改。通过测试,我得出结论,它已经改为math.random给出的东西 - 每次我调用newRDD时Vector都会发生变化。我知道有一个谱系图,也许这与它有关。我需要将RDD中保存的Vector更新为新值,我需要重复这样做。

感谢。

1 个答案:

答案 0 :(得分:2)

RDD是不可变的结构,旨在通过集群分发对数据的操作。 在您观察到的行为中有两个元素发挥作用:

每次都可以计算RDD谱系。在这种情况下,这意味着对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)

虽然这可能适用于单个计算机,因为所有Vector引用都是本地的,但它不会扩展到集群,因为查找引用将被序列化并且不会保留突变。因此,它存在为何使用Spark的问题。

要在Spark上实现,此算法需要重新设计才能用转换表示,而不是准时查找/突变。