Apache spark 避免";“任务不可序列化”;在类中使用嵌套方法

Apache spark 避免";“任务不可序列化”;在类中使用嵌套方法,apache-spark,Apache Spark,我理解访问超出闭包范围的字段或方法时出现的常见“任务不可序列化”问题 为了解决这个问题,我通常定义这些字段/方法的本地副本,这样就不需要序列化整个类: 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(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(行:字符串)=行。拆分(“;”)
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.split(“;”)
println(f.map(mapFn()).count)
} 
} 
这与Scala表示嵌套函数的方式有关吗

处理这个问题的推荐方法是什么?
避免嵌套函数?

在第一种情况下,
f.map(mapFN())
相当于
f.map(new Function(){override def apply(…)=mapFN(…)})
而在第二种情况下,它只是
f.map(mapFN)
?当您使用
def
声明一个方法时,它可能只是某个匿名类中的一个方法,该类对封闭类具有隐式
$outer
引用。但是
map
需要一个
函数
,因此编译器需要包装它。在包装器中,您只引用该匿名类的某些方法,而不引用实例本身。如果使用
val
,则直接引用传递到
映射的函数。我对此不确定,只是想大声说出来…

我也看到了这一点,一旦他们改成val's not defs,它就会起作用!因此,感谢分享这一观察结果。