有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在单个节点的Spark中运行计算

我有一个RDD,比如:

JavaPairRDD<PointFlag, Point> keyValuePair = ...

我想输出一个RDD,如下所示:

JavaRDD<Point> valuesRemainingAfterProcessing = processAndOutputSkylinePoints(keyValuePair)

处理将在单个节点中进行,因为处理需要所有值。(将它们与旗帜进行比较)

我想做的是:

  1. 将所有内容映射到单个ID:JavaPairRDD<Integer, Tuple2<PointFlag, Point>> singleIdRDD = keyValuePair.mapToPair(fp -> new Tuple2(0, fp));
  2. 执行以下处理:JavaRDD<Iterable<Point>> iterableGlobalSkylines = singleIdRDD.map(ifp -> calculateGlobalSkyline(ifp));(calculateGlobalSkyline()返回一个List<Point>
  3. 转换为JavaRDD<Point>JavaRDD<Point> globalSkylines = iterableGlobalSkylines.flatMap(p -> p);

这对我来说似乎是一个肮脏的黑客行为,我想知道是否有更好的方法来做到这一点


共 (1) 个答案

  1. # 1 楼答案

    我发现了一个很好的解决方案(肯定不会那么详细),就是使用Spark API中的glom()函数。此函数返回前一个RDD的所有元素的单个List,或以官方术语返回:

    Return an RDD created by coalescing all elements within each partition into a list.

    首先,您必须将RDD简化为一个分区。以下是解决方案:

    JavaPairRDD<PointFlag, Point> keyValuePair = ...;
    JavaPairRDD<PointFlag, Point> singlePartition = keyValuePair.coalesce(1);
    JavaRDD<List<Tuple2<PointFlag, Point>>> groupedOnASingleList = keyValuePair.glom();
    JavaRDD<Point> globalSkylinePoints = groupedOnASingleList.flatMap(singleList -> getGlobalSkylines(singleList));
    

    如果有人有更好的答案,请随时发布