我在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,但没有提示。
提前致谢!
答案 0 :(得分:1)
当您直接调用_date
时,您需要从驱动程序中获取_date
的值,因为它在闭包中捕获并序列化并发送给执行程序。当您使用getDate
方法时,您只需在执行程序上调用该方法,该方法在执行程序上返回_date
的值,即null
,因为您从未初始化它。
将日期作为参数传递给run
可能是一个更好的解决方案,在超类中有一个字段,因为它使得更明显的是什么。
答案 1 :(得分:0)
我不是100%确定你想要做什么,但是,如果我已经正确理解你的实施,那么你的解决方案将取代:
getDate.replace("-", "/")
到
each.getDate.replace("-", "/")