Я написал метод, который должен учитывать случайное число, чтобы имитировать распределение Бернулли. Я использую random.nextDouble
для генерации числа от 0 до 1, а затем принимаю мое решение на основе этого значения, учитывая мой параметр вероятности.
Моя проблема в том, что Spark генерирует одни и те же случайные числа в каждой итерации моей функции отображения цикла. Я использую API DataFrame
. Мой код следует за этим форматом:
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()
Я провел некоторое исследование, и, похоже, это связано с детерминированной природой Спаркса.