Spark:使用替换样本增加RDD的大小

时间:2018-05-16 23:53:56

标签: scala apache-spark

我有一个RDD [(String,Array [String])]我需要复制里面的数据以增加它的大小。

我在这里阅读了https://stackoverflow.com/a/41787801/9759150和replacemente你可以在样本中获得相同的元素两次。

例如:

如果RDD.count()是35个元素,我需要从中生成一个包含200个元素的RDD。我怎么能这样做?

我看到申请样本是这样的:

val sampledRDD = rdd.sample(true, fraction, seed)

我不知道如何为我的问题选择fraction参数。

谢谢!

2 个答案:

答案 0 :(得分:1)

有关rdd.sample()中fraction的含义的更多信息,请参阅this答案。简短的故事是,它代表了抽取样本的概率。这意味着最终的rdd不能保证完全等于指定的分数*原始大小。

我会以相反的方向接近这个:

  1. 首先,生成一个RDD,它只是原始的RDD,重复几次
  2. 现在,从该RDD中取样到您想要的大小。
  3. 类似的东西:

    val rdds = (1 to 10).map(_ => originalRdd)
    val bigRdd = sc.union(rdds)
    val sampledRdd = bigRdd.sample(true, fraction, seed)
    

    并设置分数,使得最终的RDD是您想要的大小:

    val fraction = numResultsIWant/100*originalRdd.count()
    

    我们在那里选择了10,因为这是我们创建的RDD的副本数量。

答案 1 :(得分:1)

我正在做一些测试,我发现.sample()能够做我想要的事情!关键是在true中保持替换(正如我在问题中所述),seed可以是任何(当然是一个数字),但fraction应该是:

val fraction = num_new.toDouble / rdd.count()  // following my examle: num_new is 200, and rdd.count() is 35

val sampledRDD = rdd.sample(true, fraction, seed)

在这种情况下,fraction = 5.71428571428571,这意味着sampledRDD将重复fraction的每个元素。