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,它就会起作用!因此,感谢分享这一观察结果。