Q1。我试图使用带有参数withReplacement:false,fraction:0.6的示例函数从Spark数据帧(13行)中获取一个简单的随机样本,但它每次运行时都会给我不同大小的样本,尽管它可以正常工作我设置了第三个参数(种子)。为什么这样?
Q2。如何在随机数生成后获得样本?
提前致谢
答案 0 :(得分:3)
如何在随机数生成后获得样本?
根据您要采样的分数,有两种不同的算法。您可以查看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,一些返回的元素将是随机的均值。如果设置种子,则会得到相同的随机数序列,因此样本中包含相同的元素。
答案 1 :(得分:0)
RDD API包含takeSample
,它将在数组&#34;中返回指定大小的&#34;样本。它的工作原理是调用sample
,直到它的样本大小大于请求的大小,然后从中随机取出指定的数字。该代码指出,由于偏向大样本量,它不应经常迭代。