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

时间:2015-08-26 14:52:14

标签: scala apache-spark dataframe apache-spark-sql pyspark

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

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

提前致谢

2 个答案:

答案 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,直到它的样本大小大于请求的大小,然后从中随机取出指定的数字。该代码指出,由于偏向大样本量,它不应经常迭代。