r.nextDouble
является константой в выражении, поэтому фактическая оценка сильно отличается от того, что вы имеете в виду.В зависимости от фактического значения выборки это либо
scala> r.setSeed(0)
scala> $"label" === 1.0 || r.nextDouble > 0.5
res0: org.apache.spark.sql.Column = ((label = 1.0) OR true)
, либо
scala> r.setSeed(4096)
scala> $"label" === 1.0 || r.nextDouble > 0.5
res3: org.apache.spark.sql.Column = ((label = 1.0) OR false)
, поэтому после упрощения это просто:
true
(ведение всех записей)или
label = 1.0
(сохраняя только те, что вы наблюдали) соответственно.
Для генерации случайных чисел вы должны использовать соответствующую функцию SQL
scala> import org.apache.spark.sql.functions.rand
import org.apache.spark.sql.functions.rand
scala> $"label" === 1.0 || rand > 0.5
res1: org.apache.spark.sql.Column = ((label = 1.0) OR (rand(3801516599083917286) > 0.5))
, хотя Spark уже предоставляет стратифицированные инструменты отбора проб:
df.stat.sampleBy(
"label", // column
Map(0.0 -> 0.5, 1.0 -> 1.0), // fractions
42 // seed
)