我编写了一个方法,必须考虑一个随机数来模拟伯努利分布。我使用 random.nextDouble
生成介于0和1之间的数字,然后根据该值和我的概率参数做出决策。
我的问题是在for循环映射函数的每次迭代中,Spark生成相同的随机数。我正在使用 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()
我做了一些研究,似乎这与Spark的确定性有关。