为什么Spark RDD上的rdd.sample()函数返回不同数量的元素,即使分数参数是相同的?例如,如果我的代码如下所示:
每次我运行代码的第二行时,它都会返回一个不等于1000的不同数字。实际上,我希望每次都能看到1000个元素,尽管这1000个元素可能会有所不同。谁能告诉我怎样才能得到样本量恰好等于1000的样品?非常感谢。
发布于 2015-09-29 15:15:25
如果你想要一个确切的样本,试着这样做
但请注意,这将返回一个数组,而不是RDD。
至于为什么a.sample(false,0.1)没有返回相同的样本大小:这是因为spark内部使用了一种称为伯努利采样的方法来获取样本。RDD参数并不表示fraction实际大小的分数。它表示总体中的每个元素被选为样本的概率,正如维基百科所说:
由于样本中的每个总体元素都是单独考虑的,因此样本大小不是固定的,而是遵循二项分布。
这本质上意味着这个数字不会保持不变。
如果将第一个参数设置为true,那么它将使用泊松采样,这也会导致不确定的结果样本大小。
更新
如果您想坚持使用sample方法,您可以为fraction参数指定更大的概率,然后调用take,如下所示:
大多数情况下,这应该会导致样本大小为1000,但不一定总是如此。如果你有足够多的人口,这是可行的。
发布于 2016-11-01 19:19:32
另一种方法是先进行takeSample,然后进行RDD。对于大型数据集,这可能会很慢。
https://stackoverflow.com/questions/32837530
复制相似问题