如何在 Spark RDD 中获取具有精确样本大小的样本?

How to get a sample with an exact sample size in Spark RDD?

为什么 rdd.sample() 在 Spark RDD return 上运行不同数量的元素,即使小数参数相同?例如,如果我的代码如下所示:

val a = sc.parallelize(1 to 10000, 3)
a.sample(false, 0.1).count

每次我 运行 代码的第二行 return 都是一个不等于 1000 的不同数字。实际上我希望每次都能看到 1000,尽管 1000 个元素可能不同。谁能告诉我如何获得样本大小正好等于 1000 的样本?非常感谢。

如果你想要一个精确的样本,尝试做

a.takeSample(false, 1000)

但请注意,这 return 是一个数组而不是 RDD

至于为什么 a.sample(false, 0.1) 没有 return 相同的样本大小:这是因为 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。如果您的人口足够多,这可能会奏效。

另一种方式可以是先takeSample,再make RDD。对于大型数据集,这可能会很慢。

sc.makeRDD(a.takeSample(false, 1000, 1234))