Ho scritto un metodo che deve considerare un numero casuale per simulare una distribuzione di Bernoulli. Sto usando random.nextDouble
per generare un numero compreso tra 0 e 1, quindi prendere la mia decisione in base a quel valore dato il mio parametro di probabilità.Spark - Generazione di numeri casuali
Il mio problema è che Spark sta generando gli stessi numeri casuali all'interno di ogni iterazione della mia funzione di mappatura del ciclo. Sto usando l'API DataFrame
. Il mio codice segue questo formato:
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)
}
Qui è la classe:
class myClass extends Serializable {
val q = qProb
def myMethod(s: String, rand: Double) = {
if (rand <= q) // do something
else // do something else
}
}
ho bisogno di un nuovo numero casuale ogni volta che viene chiamato myMethod
. Ho provato anche la generazione del numero dentro il mio metodo con java.util.Random
(scala.util.Random
V10 non estendere Serializable
) come qui di seguito, ma sto ancora ricevendo gli stessi numeri all'interno di ogni ciclo for
val r = new java.util.Random(s.hashCode.toLong)
val rand = r.nextDouble()
Ho fatto qualche ricerca, e sembra che questo abbia a che fare con la natura deterministica di Sparks.
ho modificato questo un po 'per risolvere il mio problema . Ho passato la val di Random nel mio metodo e ho generato numeri casuali da lì dentro. Questo ha risolto il mio problema, ma ho dovuto usare 'java.util.Random' per motivi di serializzabilità. –