变量在关闭时设置为默认值

时间:2019-01-10 12:37:33

标签: scala apache-spark

使用Spark 2.2.0时,我遇到了相当奇怪的闭包行为。这个程序

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

打印“结果1”,以便在评估amap等于零(默认值)。我究竟做错了什么?我应该如何将各种常量传递给RDD转换?

PS。该应用程序在客户端模式下的YARN群集上执行。

1 个答案:

答案 0 :(得分:3)

Quick Start Guide

中所述
  

应用程序应定义main()方法,而不是扩展scala.App。 scala.App的子类可能无法正常工作。

在实践中,App的惰性特性与Spark的许多功能(包括序列化和Accumulators)相互作用。

要解决此问题,只需重写您的代码即可使用标准main

object SparkConst {
  def main(args: Array[String]) = {
    val spark = SparkSession.builder()
    ...
  }
}