【问题标题】:Spark: increase the size of an RDD using sample with replacementSpark:使用带替换的样本增加 RDD 的大小
【发布时间】:2018-05-17 22:30:23
【问题描述】:

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

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

例如:

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

我看到应用示例是这样的:

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

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

谢谢!

【问题讨论】:

    标签: scala apache-spark


    【解决方案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

    【讨论】:

    • 嗯,这更容易。也很有趣。
    【解决方案2】:

    您可以查看this 答案以获取有关rdd.sample() 中分数含义的更多信息。简而言之,它代表了抽取样本的概率。这意味着最终的 rdd 不能保证完全等于指定的分数*原始大小。

    我会朝相反的方向处理:

    1. 首先,生成一个简单的原始 RDD,重复多次的 RDD
    2. 现在,从 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 的副本数。

    【讨论】:

    • 应用这种方法会很棒。但在第一行,我收到了这条消息:cannot resolve symbol map.
    • 对不起。我已经编辑了答案。让我知道这是否适合您。
    猜你喜欢
    • 2015-12-26
    • 2017-03-07
    • 1970-01-01
    • 2016-03-25
    • 2022-11-15
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多