【发布时间】:2014-05-19 08:26:09
【问题描述】:
我了解访问超出闭包范围的字段或方法时通常会出现的“任务不可序列化”问题。
为了解决这个问题,我通常定义这些字段/方法的本地副本,这样就避免了序列化整个类的需要:
class MyClass(val myField: Any) {
def run() = {
val f = sc.textFile("hdfs://xxx.xxx.xxx.xxx/file.csv")
val myField = this.myField
println(f.map( _ + myField ).count)
}
}
现在,如果我在run方法中定义了一个嵌套函数,它就不能被序列化:
class MyClass() {
def run() = {
val f = sc.textFile("hdfs://xxx.xxx.xxx.xxx/file.csv")
def mapFn(line: String) = line.split(";")
val myField = this.myField
println(f.map( mapFn( _ ) ).count)
}
}
我不明白,因为我认为“mapFn”会在范围内...... 更奇怪的是,如果我将 mapFn 定义为 val 而不是 def,那么它可以工作:
class MyClass() {
def run() = {
val f = sc.textFile("hdfs://xxx.xxx.xxx.xxx/file.csv")
val mapFn = (line: String) => line.split(";")
println(f.map( mapFn( _ ) ).count)
}
}
这与 Scala 表示嵌套函数的方式有关吗?
处理此问题的推荐方法是什么? 避免嵌套函数?
【问题讨论】:
-
我也看到了这一点,一旦他们更改为 val's not defs 就可以了!感谢您分享这一观察结果。
标签: apache-spark