我寫過一個方法,必須考慮一個隨機數來模擬伯努利分佈。我正在使用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'。 –