Итак, у меня есть что-то вроде этого. Обратите внимание, что baseTrait
(признак) здесь является сериализуемым, и поэтому thisClass
(класс Object) также должен быть сериализуемым.
object thisClass extends baseTrait {
private var someVar = null
def someFunc: RDD[...] {
...
// assigned some string value or an empty string value (not null anymore)
someVar = ...
...
if (someVar != "")
someRDD.filter(x => aFunc(x, someVar))
else
...
}
В режиме кластера, когда я вызываю функцию someFunc
(который является статическим методом, поскольку thisClass
является классом Object) Я получаю исключение нулевого указателя, которое, я думаю, связано с тем, что someVar
не сериализуется должным образом. Потому что, когда я делаю это, он отлично работает в кластерном режиме.
if (someVar != "") {
val someVar_ = someVar
someRDD.filter(x => aFunc(x, someVar_))
}
Есть идеи, что пошло не так в исходном коде, когда thisClass
в первую очередь сериализуем?
Я предполагаю, что можно использовать переменную сериализуемого класса из другого класса, но если вы попытаетесь сделать это внутри этого класса, у вас могут возникнуть проблемы, так как в этом случае у вас будет среда выполнения, пытающаяся сериализовать тот же классоткуда закрытие вызывается. Что ты думаешь?