如何替换RDD的元素

时间:2014-11-23 17:40:41

标签: java list iterator apache-spark

我有这样的RDD:

JavaPairRDD<SubspaceFlag, Iterable<Point>> flagPointPairs

示例值:

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

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

我需要从Iterable<Point>的{​​{1}}部分删除一些元素。例如,我只需要保留支配其他Tuple2的点。

最后,我留下了一个临时列表(x1 <= x2 AND y1 < y2 OR y1 <= y2 AND x1 < x2),我想将其转换回[(5, 5), (6, 1)] - &gt; JavaPairRDD<SubspaceFlag, Iterable<Point>>

我知道如何访问(01), [(5, 5), (6, 1)],我知道如何从Iterable<Point>创建我感兴趣的较小列表,但我不知道如何将该列表重新添加到RDD中随附Iterable<Point>

2 个答案:

答案 0 :(得分: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代码非常相似(只是更详细)并留给读者练习。

答案 1 :(得分:1)

@ 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<PointFlag, Iterable<Point>> dominatingPairs = flagPointPairs.mapToPair(fp -> new Tuple2(fp._1, localSkylines(fp._2)));

这里的主要关键区别是两个:

  1. 在Java中为了获得JavaPairRDD,您必须使用.mapToPair()并使用new Tuple2(left, right)
  2. 要返回Iterable<Point>,您不需要转换List<Point>,因为它已经是Iterable<Point>