有 Java 编程相关的问题?

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

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) 个答案

  1. # 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中,做你想做的事情就是:

    lines = sc.textFile(fdfileString)
    println("lines count = " + lines)
    lines.foreach(println)
    println("finished")