java在单个节点的Spark中运行计算
我有一个RDD,比如:
JavaPairRDD<PointFlag, Point> keyValuePair = ...
我想输出一个RDD,如下所示:
JavaRDD<Point> valuesRemainingAfterProcessing = processAndOutputSkylinePoints(keyValuePair)
处理将在单个节点中进行,因为处理需要所有值。(将它们与旗帜进行比较)
我想做的是:
- 将所有内容映射到单个ID:
JavaPairRDD<Integer, Tuple2<PointFlag, Point>> singleIdRDD = keyValuePair.mapToPair(fp -> new Tuple2(0, fp));
- 执行以下处理:
JavaRDD<Iterable<Point>> iterableGlobalSkylines = singleIdRDD.map(ifp -> calculateGlobalSkyline(ifp));
(calculateGlobalSkyline()返回一个List<Point>
) - 转换为
JavaRDD<Point>
:JavaRDD<Point> globalSkylines = iterableGlobalSkylines.flatMap(p -> p);
这对我来说似乎是一个肮脏的黑客行为,我想知道是否有更好的方法来做到这一点
# 1 楼答案
我发现了一个很好的解决方案(肯定不会那么详细),就是使用Spark API中的
glom()
函数。此函数返回前一个RDD的所有元素的单个List
,或以官方术语返回:Return an RDD created by coalescing all elements within each partition into a list.
首先,您必须将RDD简化为一个分区。以下是解决方案:
如果有人有更好的答案,请随时发布