Car*_*ter 15 sample apache-spark rdd
为什么rdd.sample()Spark RDD 上的函数返回不同数量的元素,即使fraction参数相同?例如,如果我的代码如下所示:
val a = sc.parallelize(1 to 10000, 3)
a.sample(false, 0.1).count
Run Code Online (Sandbox Code Playgroud)
每次我运行代码的第二行时,它返回一个不等于1000的不同数字.实际上我希望每次看到1000,尽管1000个元素可能不同.谁能告诉我如何获得样本大小恰好等于1000的样本?非常感谢你.
Bha*_*ikh 27
如果你想要一个精确的样品,试试吧
a.takeSample(false, 1000)
Run Code Online (Sandbox Code Playgroud)
但请注意,这会返回一个数组,而不是一个数组RDD.
至于为什么a.sample(false, 0.1)不返回相同的样本大小:那是因为spark内部使用了一个名为伯努利采样的东西来取样.该fraction参数不代表RDD实际大小的分数.它表示为样本选择群体中每个元素的概率,并且维基百科说:
因为样本的每个元素被单独考虑用于样本,所以样本大小不是固定的,而是遵循二项分布.
这实际上意味着这个数字不会保持不变.
如果将第一个参数设置为true,则它将使用称为泊松采样的东西,这也会导致非确定性的结果样本大小.
更新
如果你想坚持使用该sample方法,你可以指定一个更大的概率fraction,然后调用take如下:
a.sample(false, 0.2).take(1000)
Run Code Online (Sandbox Code Playgroud)
这应该在大多数情况下(但不一定总是)导致样本大小为1000.如果您拥有足够多的人口,这可能会有效.
| 归档时间: |
|
| 查看次数: |
23333 次 |
| 最近记录: |