方法关闭Spark

时间:2017-02-10 04:57:31

标签: scala apache-spark

我在Spark中获得了简单的getter方法的意外行为。

1)我有一个抽象类,带有变量及其getter。

abstract class SparkApp {
   private var _date: String = _
   def getDate: String = _date

   def run(): Unit

   def main(args: Array[String]): Unit = {
      _date: String = "2017-02-10"
      run()
   }
}

2)扩展SparkApp并进行RDD转换。

object MySparkApp extends SparkApp {
   override def run(): Unit = {
      rdd.map { each => 
         // Call parent's method
         // getDate returns null, _date has value though.
         getDate.replace("-", "/")
      }
   }
}

3)在群集中运行MySparkApp,然后getDate返回null。
4)但是,如果直接调用_date,它将按预期工作。

所以我的问题是,这两者之间的区别是什么? 我通过Spark文档阅读Passing Functions to Spark,但没有提示。

提前致谢!

2 个答案:

答案 0 :(得分:1)

当您直接调用_date时,您需要从驱动程序中获取_date的值,因为它在闭包中捕获并序列化并发送给执行程序。当您使用getDate方法时,您只需在执行程序上调用该方法,该方法在执行程序上返回_date的值,即null,因为您从未初始化它。

将日期作为参数传递给run可能是一个更好的解决方案,在超类中有一个字段,因为它使得更明显的是什么。

答案 1 :(得分:0)

我不是100%确定你想要做什么,但是,如果我已经正确理解你的实施,那么你的解决方案将取代:

getDate.replace("-", "/")

each.getDate.replace("-", "/")