apache-spark - 如何在Spark RDD中获取具有精确样本量的样本?

标签 apache-spark sample rdd

为什么即使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/

相关文章:

scala - 如何对 spark 上数据帧上的数据进行非规范化

Apache Spark RDD 的 Scalaz 类型类

r - 在 SparkR 中的 DataFrame 列上使用 substr()

java - 框架是 sample 吗?

c++ - 如何优化拒绝采样

r - 如何在R中随机采样但保持某些值的位置相同

python-2.7 - PySpark.sql.filter 未按预期执行

scala - Spark 过滤数据框中的列以及集合中的单词

scala - 如何对 RDD 进行分区

apache-spark - Apache Spark 处理 case 语句