Tôi đã viết một phương pháp phải xem xét một số ngẫu nhiên để mô phỏng phân phối Bernoulli. Tôi đang sử dụng random.nextDouble
để tạo số từ 0 đến 1 sau đó đưa ra quyết định dựa trên giá trị đó cho tham số xác suất của tôi.Spark - Số ngẫu nhiên Thế hệ
Vấn đề của tôi là Spark đang tạo ra các số ngẫu nhiên giống nhau trong mỗi lần lặp của hàm lập bản đồ vòng lặp của tôi. Tôi đang sử dụng API DataFrame
. Mã của tôi sau định dạng này:
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)
}
Đây là lớp:
class myClass extends Serializable {
val q = qProb
def myMethod(s: String, rand: Double) = {
if (rand <= q) // do something
else // do something else
}
}
Tôi cần một số ngẫu nhiên mới mỗi khi myMethod
được gọi. Tôi cũng đã cố gắng tạo ra các số bên phương pháp của tôi với java.util.Random
(scala.util.Random
v10 không mở rộng Serializable
) như dưới đây, nhưng tôi vẫn nhận được những con số giống nhau trong mỗi vòng lặp for
val r = new java.util.Random(s.hashCode.toLong)
val rand = r.nextDouble()
tôi đã thực hiện một số nghiên cứu, và dường như điều này có liên quan đến tính chất xác định của Sparks.
của tôi sửa đổi này hơi để giải quyết vấn đề của tôi . Tôi đã chuyển val ngẫu nhiên vào phương thức của tôi và tạo ra các số ngẫu nhiên từ trong đó. Điều này giải quyết vấn đề của tôi, nhưng tôi đã phải sử dụng 'java.util.Random' cho lý do serializeability. –