2016-04-08 7 views
4

I einfachen Code ausgeführt in Java Spark Quickstart Guide geschrieben:Verschiedenes Ergebnis in derselben Scala und Java Funken Funktionen

public static void main(String[] args) { 
     SparkConf conf = new SparkConf().setAppName("Simple Application").setMaster("local[4]"); 
     JavaSparkContext sc = new JavaSparkContext(conf); 
     Accumulator<Integer> counter = sc.accumulator(0); 
     List<Integer> data = Arrays.asList(1, 2, 3, 4, 5); 
     JavaRDD<Integer> rdd = sc.parallelize(data); 
     rdd.foreach(counter::add); 
     System.out.println("Counter value " + counter); 
} 

Er druckt "Counter value 15" wie erwartet. Ich habe Code mit derselben Logik in Scala geschrieben:

object Counter extends App { 
    val conf = new SparkConf().setAppName("Simple Application").setMaster("local[4]") 
    val sc = new SparkContext(conf) 
    val counter = sc.accumulator(0) 
    val data = Array(1, 2, 3, 4, 5) 
    val rdd = sc.parallelize(data) 
    rdd.foreach(x => counter += x) 
    println(s"Counter value: $counter") 
} 

Aber es jedes Mal druckt falsches Ergebnis (< 15). Was ist falsch in meinem Scala-Code?

Java spark lib "org.apache.spark:spark-core_2.10:1.6.1" 
Scala spark lib "org.apache.spark" %% "spark-core" % "1.6.1" 
+0

können Sie versuchen, mit 'map' statt' foreach'? (Ich weiß, dass das Ergebnis verworfen wird, aber versuchen Sie es trotzdem; rufen Sie einfach etwas wie 'rdd.count()', um die Auswertung zu erzwingen) – ale64bit

+0

@ ale64bit Ich habe 'rdd.map (x => counter + = x) ausgeführt. count() 'aber es erzeugt auch falsches Ergebnis – Cortwave

Antwort

6

Eine Beratung in der quick-start Dokumentation sagt:

Hinweis, die Anwendungen sollte eine Methode main() anstelle von erstreckenden scala.App definieren. Unterklassen von scala.App funktionieren möglicherweise nicht richtig.

Vielleicht ist das das Problem?

Versuchen mit:

object Counter { 
    def main(args: Array[String]): Unit = { 
     val conf = new SparkConf().setAppName("Simple Application").setMaster("local[4]") 
     val sc = new SparkContext(conf) 
     val counter = sc.accumulator(0) 
     val data = Array(1, 2, 3, 4, 5) 
     val rdd = sc.parallelize(data) 
     rdd.foreach(x => counter += x) 
     println(s"Counter value: $counter") 
    } 
} 
+0

Großartig! Es funktioniert, danke – Cortwave

Verwandte Themen