为什么即使R分参数相同,Spark RDD上的rdd.sample()
函数仍返回不同数量的元素?例如,如果我的代码如下所示:
val a = sc.parallelize(1 to 10000, 3)
a.sample(false, 0.1).count
每次我运行代码的第二行时,它都会返回一个不同的数字,该数字不等于1000。实际上我希望每次都能看到1000,尽管1000个元素可能有所不同。谁能告诉我如何获得样本大小恰好等于1000的样本?非常感谢你。
最佳答案
如果您想要一个准确的样本,请尝试做
a.takeSample(false, 1000)
但是请注意,这将返回Array而不是
RDD
。至于为什么
a.sample(false, 0.1)
不会返回相同的样本大小:这是因为spark内部使用了一个称为Bernoulli sampling的样本来进行采样。 fraction
参数不代表RDD实际大小的一部分。它代表样本中每个元素被选中的概率,正如维基百科所说:Because each element of the population is considered separately for the sample, the sample size is not fixed but rather follows a binomial distribution.
从本质上讲,这意味着数字不会保持固定。
如果将第一个参数设置为
true
,则它将使用称为Poisson sampling的名称,这也会导致不确定的结果样本大小。更新
如果要坚持使用
sample
方法,则可以为fraction
参数指定较大的概率,然后按如下所示调用take
:a.sample(false, 0.2).take(1000)
在大多数情况下(但不一定总是如此),这会导致样本数量为1000。如果人口足够大,这可能会起作用。
关于apache-spark - 如何在Spark RDD中获取具有精确样本量的样本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32837530/