я выполнил простой код, написанный на 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"
вы можете попробовать использовать 'map' вместо' foreach'? (Я знаю, что результат будет отброшен, но попробуйте его в любом случае, просто назовите что-то вроде 'rdd.count()' для принудительной оценки) – ale64bit
@ ale64bit Я выполнил 'rdd.map (x => counter + = x). count() ', но также приводит к некорректному результату – Cortwave