Ich habe eine Methode geschrieben, die eine Zufallszahl berücksichtigen muss, um eine Bernoulli-Verteilung zu simulieren. Ich benutze random.nextDouble
, um eine Zahl zwischen 0 und 1 zu generieren und dann meine Entscheidung basierend auf diesem Wert unter Berücksichtigung meines Wahrscheinlichkeitsparameters zu treffen.Spark - Zufallszahlengenerierung
Mein Problem ist, dass Spark die gleichen Zufallszahlen innerhalb jeder Iteration meiner For-Schleife Mapping-Funktion generiert. Ich benutze die DataFrame
API. Mein Code folgt diesem Format:
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)
}
Hier ist die Klasse:
class myClass extends Serializable {
val q = qProb
def myMethod(s: String, rand: Double) = {
if (rand <= q) // do something
else // do something else
}
}
Ich brauche eine neue Zufallszahl jedes Mal myMethod
genannt wird. Ich habe auch versucht mit java.util.Random
die Zahl in meinem Verfahren zu erzeugen, wie unten (scala.util.Random
v10 nicht Serializable
erstreckt), aber ich bin immer noch die gleichen Zahlen immer innerhalb jeder für Schleife
val r = new java.util.Random(s.hashCode.toLong)
val rand = r.nextDouble()
ich einige der Forschung getan haben, und Es scheint, dass dies mit Funken deterministischer Natur zu tun hat.
ich modifiziert diese leicht mein Problem zu lösen . Ich habe das Random val in meine Methode eingegeben und dort Zufallszahlen erzeugt. Dies löste mein Problem, aber ich musste 'java.util.Random' aus Gründen der Serialierbarkeit verwenden. –