package sparkCore.accumulator
import org.apache.spark.sql.SparkSession
object AccumulatorV1 {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName(this.getClass.getName)
.master("local[*]")
.getOrCreate()
val sc = spark.sparkContext
val rdd01 = sc.makeRDD(List(1, 2, 3, 4, 5))
var sum = 0
rdd01.foreach {
x => {
println(s"Executor... x=$x sum=$sum")
sum += x
}
}
println(s"Driver... sum=$sum")
sc.stop()
}
}
package sparkCore.accumulator
import org.apache.spark.sql.SparkSession
object AccumulatorV2 {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName(this.getClass.getName)
.master("local[*]")
.getOrCreate()
val sc = spark.sparkContext
val rdd01 = sc.makeRDD(List(1, 2, 3, 4, 5))
val sumAcc = sc.longAccumulator("sumAcc")
rdd01.foreach(sumAcc.add(_))
println(sumAcc.value)
sc.stop()
}
}
package sparkCore.accumulator
import org.apache.spark.sql.SparkSession
object AccumulatorV3 {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName(this.getClass.getName)
.master("local[*]")
.getOrCreate()
val sc = spark.sparkContext
val rdd01 = sc.makeRDD(List(1, 2, 3, 4, 5))
val sumAcc = sc.longAccumulator("sumAcc")
val rdd02 = rdd01.map {
x => {
sumAcc.add(x)
x
}
}
rdd02.collect
rdd02.collect
println(sumAcc.value)
sc.stop()
}
}
package sparkCore.accumulator
import org.apache.spark.sql.SparkSession
import org.apache.spark.util.AccumulatorV2
import scala.collection.mutable
object AccumulatorV4 {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName(this.getClass.getName)
.master("local[*]")
.getOrCreate()
val sc = spark.sparkContext
val rdd01 = sc.makeRDD(List("hello", "java", "java", "scala", "scala", "scala"))
val myAcc = new MyAccumulator
sc.register(myAcc, "myAcc")
rdd01.foreach {
word => {
myAcc.add(word)
}
}
val wordcount = myAcc.value
println(wordcount)
sc.stop()
}
}
class MyAccumulator extends AccumulatorV2[String, mutable.Map[String, Long]] {
private val map = mutable.Map[String, Long]()
override def isZero: Boolean = map.isEmpty
override def copy(): AccumulatorV2[String, mutable.Map[String, Long]] = new MyAccumulator
override def reset(): Unit = map.clear()
override def add(word: String): Unit = {
val count = map.getOrElse(word, 0L) + 1
map.update(word, count)
}
override def merge(other: AccumulatorV2[String, mutable.Map[String, Long]]): Unit = {
val map2: mutable.Map[String, Long] = other.value
map2.foreach {
case (word, cnt) => {
val count = map.getOrElse(word, 0L) + cnt
map.update(word, count)
}
}
}
override def value: mutable.Map[String, Long] = map
}