我写过一个方法,必须考虑一个随机数来模拟伯努利分布。我正在使用random.nextDouble
生成0到1之间的数字,然后根据给定我的概率参数的值作出我的决定。Spark - Random Number Generation
我的问题是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
)像下面,但我仍然得到在每一个同一个号码循环
val r = new java.util.Random(s.hashCode.toLong)
val rand = r.nextDouble()
我做了一些研究,看起来这与Sparks的确定性本质有关。
我修改这个稍微解决我的问题。我将Random val传入我的方法,并从那里生成随机数。这解决了我的问题,但出于序列化原因,我不得不使用java.util.Random'。 –