Résultat différent dans les mêmes fonctions Scala et Java spark


J'ai exécuté du code simple écrit en Java à partir du guide de démarrage rapide Spark:

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);
}

, Il imprime "Counter value 15" comme prévu. J'ai du code avec la même logique écrit en Scala:

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")
}

Mais il imprime à chaque fois un résultat incorrect (

Java spark lib "org.apache.spark:spark-core_2.10:1.6.1"
Scala spark lib "org.apache.spark" %% "spark-core" % "1.6.1"
Author: Cortwave, 2016-04-08

1 answers

Un conseil dans le démarrage rapide documentation dit:

Notez que les applications doivent définir une méthode main () au lieu de l'extension de la scala.App. Les sous-classes de la scala.Application peut ne pas fonctionner correctement.

Peut-être que c'est le problème?

Essayez avec:

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")
    }
}
 6
Author: ale64bit, 2016-04-08 16:39:47