我有一个RDD [(String,Array [String])]我需要复制里面的数据以增加它的大小。
我在这里阅读了https://stackoverflow.com/a/41787801/9759150和replacemente你可以在样本中获得相同的元素两次。
例如:
如果RDD.count()是35个元素,我需要从中生成一个包含200个元素的RDD。我怎么能这样做?
我看到申请样本是这样的:
val sampledRDD = rdd.sample(true, fraction, seed)
我不知道如何为我的问题选择fraction
参数。
谢谢!
答案 0 :(得分:1)
有关rdd.sample()中fraction的含义的更多信息,请参阅this答案。简短的故事是,它代表了抽取样本的概率。这意味着最终的rdd不能保证完全等于指定的分数*原始大小。
我会以相反的方向接近这个:
类似的东西:
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
的每个元素。