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

Q1 . 我试图使用带有参数withReplacement的示例函数从一个Spark数据帧(13行)中获取一个简单的随机样本:false,分数:0.6但它每次运行时都会给我不同大小的样本,尽管它可以正常工作我设置了第三个参数(种子) . 为什么这样?

Q2 . 随机数生成后如何获得样本?

提前致谢

回答(2)

2 years ago

随机数生成后如何获得样本?

根据您要采样的分数,有两种不同的算法 . 你可以查看Justin's Pihony回答SPARK Is sample method on Dataframes uniform sampling?

它每次运行时都会给我不同大小的样本,但是当我设置第三个参数(种子)时它可以正常工作 . 为什么这样?

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

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

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

记住这一点很明显,假设 GapSamplingIterator 没有任何错误,等于fraction * rdd.count,一些返回的元素将是随机的均值 . 如果设置种子,则会得到相同的随机数序列,因此样本中包含相同的元素 .

2 years ago

RDD API包含 takeSample ,它将返回"sample of specified size in an array" . 它通过调用 sample 直到它获得大于请求的样本大小,然后从中随机获取指定的数字 . 该代码表示,由于偏向于大样本量,因此不应经常迭代 .