我的 RDD 自己改变了他的价值观

My RDD change his values himself

我有一个基本的 RDD[Object],我使用 nextGaussian 和 nextDouble scala 函数在对象值上应用带有哈希函数的映射。当我打印值时,每次打印都会发生变化

def hashmin(x:Data_Object, w:Double) = {
    val x1 = x.get_vector.toArray
    var a1 = Array(0.0).tail
    val b = Random.nextDouble * w

    for( ind <- 0 to x1.size-1) {
        val nG = Random.nextGaussian
        a1 = a1 :+ nG
    }

    var sum = 0.0

    for( ind <- 0 to x1.size-1) {
        sum = sum + (x1(ind)*a1(ind))
    }           

    val hash_val = (sum+b)/w

    val hash_val1 = (x.get_id,hash_val)
    hash_val1
}


val w = 8
val rddhash = parsedData.map(x => hashmin(x,w))
rddhash.foreach(println)
rddhash.foreach(println)

我不明白为什么。提前谢谢你。

RDDs 只是一个 "pointer" 到数据 + 应用到它的操作。动作通过执行 RDD 沿袭具体化这些操作。

因此,RDD 基本上是在请求操作时重新计算的。在这种情况下,每次调用 foreach 操作时都会评估调用 hashmin 的映射函数。

选项很少:

  • 缓存 RDD - 这将导致沿袭被破坏,第一次转换的结果将被保留:

    val rddhash = parsedData.map(x => hashmin(x,w)).cache()

  • 为你的随机函数使用一个种子,这样每次生成的伪随机序列都是相同的。

RDD 是惰性的——它们是在使用时计算的。因此,每次调用 foreach.

时,都会再次调用 Random.nextGaussian

如果你想保持固定值,你可以使用persist()来存储一个RDD。