【问题标题】:How to get a sample with an exact sample size in Spark RDD?如何在 Spark RDD 中获取具有精确样本大小的样本?
【发布时间】:2015-12-26 13:16:51
【问题描述】:

为什么即使分数参数相同,Spark RDD 上的rdd.sample() 函数也会返回不同数量的元素?例如,如果我的代码如下:

val a = sc.parallelize(1 to 10000, 3)
a.sample(false, 0.1).count

每次我运行代码的第二行时,它都会返回一个不等于 1000 的不同数字。实际上,我希望每次都能看到 1000,尽管 1000 个元素可能不同。谁能告诉我如何获得样本量正好等于 1000 的样本?非常感谢。

【问题讨论】:

标签: apache-spark sample rdd


【解决方案1】:

如果您想要一个精确的样本,请尝试这样做

a.takeSample(false, 1000)

但请注意,这会返回一个数组而不是 RDD

至于为什么 a.sample(false, 0.1) 不返回相同的样本大小:这是因为 spark 内部使用称为 Bernoulli sampling 的东西来获取样本。 fraction 参数不代表 RDD 实际大小的分数。它表示总体中每个元素被选为样本的概率,正如维基百科所说:

因为样本的每个元素都是单独考虑的,所以样本量不是固定的,而是服从二项分布。

这实质上意味着这个数字不会保持不变。

如果您将第一个参数设置为 true,那么它将使用名为 Poisson sampling 的东西,这也会导致结果样本大小不确定。

更新

如果您想坚持使用sample 方法,您可以为fraction 参数指定更大的概率,然后调用take,如下所示:

a.sample(false, 0.2).take(1000)

这应该在大多数情况下(但不一定总是)导致样本大小为 1000。如果您有足够大的人口,这可能会起作用。

【讨论】:

  • 样本/获取实施是否有利于某些记录(文件顶部)-> 不是一个好的样本
【解决方案2】:

另一种方法是先takeSample,然后制作RDD。对于大型数据集,这可能会很慢。

sc.makeRDD(a.takeSample(false, 1000, 1234))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多