【发布时间】:2016-07-18 06:19:28
【问题描述】:
我正在尝试 foreach 一个 RDD 并将数据收集到一个字符串构建器中。但这并没有发生,因为 foreach 在执行程序节点上运行,而字符串生成器在驱动程序节点上运行。有什么方法可以实现我的目标吗?我不想使用 collect 操作,因为它很昂贵。
private static StringBuilder collect(JavaRDD<String> javaRDD) {
StringBuilder builder = new StringBuilder();
javaRDD.foreach(x -> builder.append(x));
System.out.println(builder.toString() + " ****");
return builder;
}
高度赞赏任何帮助。
【问题讨论】:
-
查看您关于驱动程序/工作人员 (spark.apache.org/docs/latest/cluster-overview.html) 的 apache spark 知识:您的(字符串)构建器存在于驱动程序中,您的 javaRDD 存在于工作人员上。如果你想从 javaRDD 获取数据到你的构建器中,你需要'collect()'。
-
你的意思是说,ter 不是 collect() 以外的方法吗?
-
更新了我的问题。谢谢@WillemM
-
是的。 (或者它的变种就像 take(x))
-
Foreach 将在 executor/slave 节点中执行,当您调用 Collect() 时,来自从节点的所有数据都将被拉到 driver program 。当您处理 TB 的数据时,这是不行的。我希望有一种替代方法来实现我的目标。
标签: apache-spark java-8 rdd