【发布时间】:2016-04-06 15:03:26
【问题描述】:
我编写了一个必须考虑随机数来模拟伯努利分布的方法。我正在使用random.nextDouble 生成一个介于 0 和 1 之间的数字,然后根据给定我的概率参数的值做出决定。
我的问题是 Spark 在我的 for 循环映射函数的每次迭代中生成相同的随机数。我正在使用DataFrame API。我的代码遵循这种格式:
val myClass = new MyClass()
val M = 3
val myAppSeed = 91234
val rand = new scala.util.Random(myAppSeed)
for (m <- 1 to M) {
val newDF = sqlContext.createDataFrame(myDF
.map{row => RowFactory
.create(row.getString(0),
myClass.myMethod(row.getString(2), rand.nextDouble())
}, myDF.schema)
}
这是课程:
class myClass extends Serializable {
val q = qProb
def myMethod(s: String, rand: Double) = {
if (rand <= q) // do something
else // do something else
}
}
每次调用myMethod 时,我都需要一个新的随机数。我还尝试使用java.util.Random(scala.util.Random v10 不扩展Serializable)在我的方法中生成数字,如下所示,但我仍然在每个 for 循环中得到相同的数字
val r = new java.util.Random(s.hashCode.toLong)
val rand = r.nextDouble()
我做了一些研究,这似乎与 Sparks 确定性有关。
【问题讨论】:
标签: scala random apache-spark spark-dataframe