简单随机采样和数据帧 SAMPLE 函数如何在 Apache Spark (Scala) 中工作?

How do simple random sampling and dataframe SAMPLE function work in Apache Spark (Scala)?

Q1。我正在尝试使用带有参数 withReplacement: false, fraction: 0.6 的样本函数从 Spark 数据帧(13 行)中获取一个简单的随机样本,但是每次我 运行 它都会给我不同大小的样本,虽然当我设置第三个参数(种子)时它工作正常。为什么会这样?

Q2。生成随机数后的样本是怎么得到的?

提前致谢

How is the sample obtained after random number generation?

根据您要采样的分数,有两种不同的算法。您可以查看 Justin's Pihony answer to

it gives me samples of different sizes every time I run it, though it work fine when I set the third parameter (seed). Why so?

如果分数高于 RandomSampler.defaultMaxGapSamplingFraction,采样由 a simple filter:

完成
items.filter { _ => rng.nextDouble() <= fraction }

否则,稍微简化一下,它会使用随机整数重复调用 drop 方法并获取下一项。

牢记这一点,很明显,假设 GapSamplingIterator 没有问题,返回的元素的数量将是随机的,均值为 fraction * rdd.count。如果您设置种子,您将获得相同的随机数序列,因此样本中包含相同的元素。

RDD API 包含 takeSample,这将 return 一个 "sample of specified size in an array"。它的工作原理是调用 sample 直到它获得的样本量大于请求的样本量,然后从中随机取指定的数字。代码评论说,由于偏向于大样本量,它不应该经常迭代。