java spark0。9.1 foreach println不工作
我使用spark-assembly_2.10-0.9.0-cdh5。0.2-hadoop2。3.0-cdh5。0.2.jar并编写一个应用程序,如下所示:
JavaRDD<String> lines = sc.textFile(fdfileString);
System.out.println("line: " + lines.count());
JavaRDD<String> l2 = lines.map(new Function<String, String>() {
@Override
public String call(String arg0) throws Exception {
System.out.println(arg0);
TestUsable.count++;
return arg0;
}
});
System.out.println("finished");
System.out.println(TestUsable.count);
运行命令使用java:java-classpath${spark_lib} 它工作但不输出内容:
line: 84498
finished
0
有人能帮我吗。谢谢
# 1 楼答案
看起来你还没有真正理解分布式函数编程的工作方式。你不能改变静态变量!这就是为什么你的计数是0。你不能在RDD上运行printlns-inside-map操作——它们会将数据打印到任何节点上的日志中
接下来,您似乎理解了Spark的惰性执行范例——Spark不会执行代码,除非它需要执行。在您的情况下,它不需要执行map,因为您没有要求它对结果执行任何操作。您需要调用一个操作:http://spark.apache.org/docs/latest/programming-guide.html#actions
我认为在你的例子中,你需要使用
foreach
动作另一点是,您最终将对数据进行两次迭代(一次用于计数,一次用于本地节点上的println),因此您可能只想
toArray
它并在本地处理它(这使得使用Spark变得毫无意义)。你到底想对你的数据做什么??如果你的建议更具体,那么我可以解释更多关于如何以分布式FP方式实现这一点的内容还强烈建议您使用Scala,当程序开始变得复杂时,使用Java进行操作非常繁琐。在Scala中,做你想做的事情就是: