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

标签 java key apache-spark key-value

我有一个像这样的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);

这对我来说看起来像是一个肮脏的黑客,我想知道是否有更好的方法来做到这一点。

最佳答案

我发现的一个很好的解决方案(绝对不那么冗长)是使用 Spark API 中的 glom() 函数。此函数返回前一个 RDD 的所有元素的单个 List 或用官方术语来说:

返回通过将每个分区内的所有元素合并到列表中而创建的 RDD。

首先,您必须将 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));

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

关于java - 在单个节点中运行 Spark 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27103977/

相关文章:

java - 在正确的窗口中创建 GUI

firebase - 如何获取 Firebase 注册 key ?

java - 尝试读取 txt 文件并将其存储到多值 HashMap 内的数组列表中

python - pyspark dataframe cube 方法返回重复的空值

apache-spark - 使用日期范围对分区数据进行 Spark SQL 查询

mysql - 如何在 Spark 1.6 中使用 SQL 子查询

java - 删除字节的最后一位

java - 匹配不同卡片的正则表达式模式

java - 是否可以编写AOP注解?

encryption - 无法为新用户生成有效的 ssh 公钥/私钥对