【问题标题】:How to replace the elements of an RDD如何替换 RDD 的元素
【发布时间】:2014-11-23 17:40:41
【问题描述】:

我有一个这样的 RDD:

JavaPairRDD<SubspaceFlag, Iterable<Point>> flagPointPairs

示例值:

(01), [(5, 5), (6, 1), (7, 2), (9, 4)]

Point是二维空间中的一个(x, y)点

我需要从Tuple2Iterable<Point> 部分中删除一些元素。例如,我只需要保留支配其他(x1 <= x2 AND y1 < y2 OR y1 <= y2 AND x1 < x2)的点。

最后我留下了一个临时列表[(5, 5), (6, 1)],我想将其转换回JavaPairRDD<SubspaceFlag, Iterable<Point>> -> (01), [(5, 5), (6, 1)]

我知道如何访问Iterable<Point>,我知道如何从Iterable<Point> 中创建我感兴趣的较小列表,但我不知道如何将该列表返回到伴随@987654332 的RDD @。

【问题讨论】:

    标签: java list iterator apache-spark


    【解决方案1】:

    RDD 是不可变结构,因此您不会替换 RDD 中的元素,而是将 RDD 转换为另一个 RDD。 在这种特定情况下,rdd.map 转换将允许您对 RDD 的每个元素应用一个函数,从而生成一个新的 RDD。

    给定

    val flagPointPairsRdd:RDD[SubspaceFlag, Iterable[Point]] = ???
    

    还有一个功能:

    def dominants(points: Iterable[Point]):Iterable[Point] = ??? //Your impl here
    

    那么你可以通过以下方式获得想要的结果:

    val dominatingPairsRdd = flagPointPairs.map{case (flag, points) => (flag, dominants(points))}
    

    等效的 Java 代码非常相似(只是更冗长),并留给读者作为练习。

    【讨论】:

    • 感谢您的回答。我更希望它是在 Java 中,因为问题是在 Java 中。不过这没什么大不了的,我也用 Java 发布了它,因为它完全不同。
    • 我经常建议学习使用 Spark 所需的少量 Scala。它让您的生活更轻松,您可以在 Spark-shell 中快速测试代码/工作/想法。
    • 你说得对,对我来说,这更像是一种“我不想走出自己的舒适区”的情况,因为我经常使用 Java,但我可能会早点去 Scala,或者稍后。
    【解决方案2】:

    @maasg 的答案几乎是我需要知道的(为了返回相同类型的 RDD,我应该只映射它)但由于我的问题是在 Java 中,而在 Java 中的答案完全不同,我将发布Java 中的答案也是如此。

    有这样的RDD:

    JavaPairRDD<SubspaceFlag, Iterable<Point>> flagPointPairs = ...

    为了返回相同类型但具有不同值的 RDD,首先您需要这样的方法:

    private Iterable<Point> localSkylines(Iterable<Point> pointIterable) {
            List<Point> localSkylines = new ArrayList<>();
    
            // find local skylines here
    
            return localSkylines;
        }
    

    然后你可以像这样制作新的RDD:

    JavaPairRDD&lt;PointFlag, Iterable&lt;Point&gt;&gt; dominatingPairs = flagPointPairs.mapToPair(fp -&gt; new Tuple2(fp._1, localSkylines(fp._2)));

    这里的主要区别有两个:

    1. 在 Java 中,为了取回 JavaPairRDD,您必须使用 .mapToPair() 并使用 new Tuple2(left, right)
    2. 要返回 Iterable&lt;Point&gt;,您无需转换 List&lt;Point&gt;,因为它已经是 Iterable&lt;Point&gt;

    【讨论】:

    • re: (1): 确实 -> 正如我所提到的,Java API 更加冗长。在 Scala 中,隐式转换从您的代码中移除了很多样板文件。回复:(2)没有区别。该函数在 Java 和 Scala 中的工作方式相同。
    • @maasg 关于 (1) 你是对的,它只是更冗长,但我将其包括在内,因为由于 API 的方式,有人可能会像我试图习惯拥有两个不同的功能一样感到头疼在 Java 中工作。关于 (2) 我提到它以防有人认为他可能需要从 List 转换为 Iterable。他可能会认为,因为我在我的问题上暗示了这一点,所以如果有人试图犯和我一样的错误,他只会看到不需要转换(在我意识到之前我尝试了大约 15 分钟来转换它我是多么愚蠢)。
    • 留下经验教训以供未来用户(或未来的自己:-)参考总是一件好事
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2021-09-16
    • 2012-01-18
    • 2011-02-15
    • 2020-01-29
    相关资源
    最近更新 更多