我有这样的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>
。
答案 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)));
这里的主要关键区别是两个:
JavaPairRDD
,您必须使用.mapToPair()
并使用new Tuple2(left, right)
Iterable<Point>
,您不需要转换List<Point>
,因为它已经是Iterable<Point>
。