2016-04-08 1 views
4

я выполнил простой код, написанный на Java от Спарк Краткого руководства:Different результат в том же Scala и Java искровых функциях

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

Он печатает "Counter value 15", как ожидалось. У меня есть код с той же логикой, написанной в 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") 
} 

Но это каждый раз, когда печатает неверный результат (< 15). Что не так в моем коде Scala?

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

вы можете попробовать использовать 'map' вместо' foreach'? (Я знаю, что результат будет отброшен, но попробуйте его в любом случае, просто назовите что-то вроде 'rdd.count()' для принудительной оценки) – ale64bit

+0

@ ale64bit Я выполнил 'rdd.map (x => counter + = x). count() ', но также приводит к некорректному результату – Cortwave

ответ

6

совет в документации quick-start говорит:

Обратите внимание, что приложения должны определить основной метод() вместо простирающейся scala.App. Подклассы scala.App могут работать некорректно.

Возможно, в этом проблема?

Попробуйте с:

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

Отлично! Он работает, спасибо – Cortwave

Смежные вопросы