Bernoulli dağılımını simüle etmek için rasgele bir sayıyı düşünmesi gereken bir yöntem yazdım. 0 ve 1 arasında bir sayı oluşturmak için random.nextDouble
kullanıyorum ve sonra olasılık parametresi verilen değere dayanarak kararımı veririm.Spark - Rastgele Sayı Üretimi
Sorunum, Spark'in döngü eşleme işlevimin her yinelemesinde aynı rasgele sayıları oluşturmasıdır. DataFrame
API kullanıyorum. Benim kod bu biçimi aşağıdaki gibidir: Her zaman myMethod
denir yeni bir rastgele sayı ihtiyaç
class myClass extends Serializable {
val q = qProb
def myMethod(s: String, rand: Double) = {
if (rand <= q) // do something
else // do something else
}
}
:
İşteval 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)
}
sınıftır. Ayrıca aşağıda gibi (Serializable
uzamaz scala.util.Random
v10) java.util.Random
ile benim yöntemi içinde bir sayı oluşturmak çalıştı, ama yine de biraz araştırma yaptık döngü
val r = new java.util.Random(s.hashCode.toLong)
val rand = r.nextDouble()
için her içindeki aynı numaraları alıyorum ve Görünüşe göre bu, Sparks deterministik doğasıyla ilgili.
biraz benim sorunu çözmek için bu değiştirilmiş . Rasgele değeri benim yöntemime aktardım ve oradan rastgele sayılar ürettim. Bu benim sorunumu çözdü, ama seri hale getirilebilirlik nedenlerinden dolayı 'java.util.Random' kullanmak zorunda kaldım. –