ベルヌーイ分布をシミュレートするために乱数を考慮する必要があるメソッドを記述しました。私はrandom.nextDouble
を使用して0と1の間の数値を生成し、その値に基づいて自分の確率パラメータを決定します。スパーク - 乱数生成
私の問題は、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
が呼び出されるたびに新しい乱数を必要としています。私はまた、以下のような(Serializable
を拡張しないscala.util.Random
V10)java.util.Random
と私の方法の中に数字を生成しようとしたが、私はまだ、私はいくつかの研究を行ってきたループ
val r = new java.util.Random(s.hashCode.toLong)
val rand = r.nextDouble()
各内の同じ番号を取得していますし、これは、スパークスの決定論的性質と関係しているようです。
1のでこれは非常に、私の問題を解決するが、私はおそらく将来的に使用されるそのエレガントな解決策ではありませんでした。私は乱数を自分のメソッドに渡し、そこから乱数を生成しました。これは私の問題を解決しましたが、直列化の理由から 'java.util.Random'を使用しなければなりませんでした。 –