I've encountered rather weird behaviour of closures when using Spark 2.2.0. This program
object SparkConst extends App {
val spark = SparkSession.builder()
.appName("spark_const")
.enableHiveSupport()
.getOrCreate()
val ctx = spark.sparkContext
ctx.setLogLevel("WARN")
val a = 2
val xs = ctx.parallelize(Seq(1))
val addValMap = xs.map(_ + a)
println(s"Result ${addValMap.collect().mkString(",")}")
}
prints "Result 1" so a
was equal to zero (default value) when map
was evaluated. What am I doing wrong? How am I supposed to pass various constants to RDD transformations?
PS. The application is executed on YARN cluster in client mode.