我使用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
任何人都可以帮助我。谢谢
答案 0 :(得分:3)
看起来你并不真正理解分布式函数式编程的工作方式。你不能改变静态变量!这就是你的计数为0的原因。你不能在RDD上的地图操作中运行printlns - 它们会将值打印到数据碰巧所在的任何节点上的日志中。
接下来,看起来你理解Spark的错误执行范例 - Spark除非需要,否则不会执行代码。在您的情况下,它不需要执行地图,因为您没有要求它对结果做任何事情。您需要调用操作:http://spark.apache.org/docs/latest/programming-guide.html#actions
我认为您要使用foreach
操作。
另一点是你将最终迭代数据两次(一次计数,一次在本地节点上打印),所以你可能只想toArray
它并在本地处理它(这有点使用火花毫无意义)。你想对你的数据做什么?如果你更具体,那么我可以解释更多关于如何以分布式FP方式做到这一点。
还强烈建议你做Scala,当程序开始变得复杂时,它在Java中极其冗长。在Scala中,做你想做的就是:
lines = sc.textFile(fdfileString)
println("lines count = " + lines)
lines.foreach(println)
println("finished")