Apache spark Apache Spark映射函数org.Apache.Spark.SparkException:任务不可序列化

Apache spark Apache Spark映射函数org.Apache.Spark.SparkException:任务不可序列化,apache-spark,java-8,sparkcore,Apache Spark,Java 8,Sparkcore,我正在学习ApacheSpark,我正在使用Java8和SparkCore2.3.2 我发现,当我在RDD上使用map函数时,它只在我使用Lambda表达式时才起作用 所以这是可行的: JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(1, 2, 3, 4)); JavaRDD<Integer> result = rdd.map(x -> x*x ); JavaRDD-rdd=sc.parallelize(Ar

我正在学习ApacheSpark,我正在使用Java8和SparkCore2.3.2

我发现,当我在RDD上使用map函数时,它只在我使用Lambda表达式时才起作用

所以这是可行的:

JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(1, 2, 3, 4));
JavaRDD<Integer> result = rdd.map(x -> x*x );
JavaRDD-rdd=sc.parallelize(Arrays.asList(1,2,3,4));
javarddresult=rdd.map(x->x*x);
但这并没有,并抛出一个org.apache.spark.SparkException:Task not serializable

JavaRDD<Integer> result = rdd.map(new Function<Integer, Integer>() {
    public Integer call(Integer x) { return x*x; }
});
javarddresult=rdd.map(新函数(){
公共整数调用(整数x){return x*x;}
});
有人能解释一下原因吗?
感谢当您声明
新函数时,它包含对包含它的类的引用。当Spark尝试将新的匿名函数实例发送给worker时,它也尝试序列化包含的类,但显然该类没有实现可序列化,或者具有其他不可序列化的成员。您可能遇到了类似
对象不可序列化(类:YourClass,值:YourClass@e49bf8a)
其中“YourClass”是包含函数声明的类

如果改为将函数声明为类的静态成员:

static Function<Integer, Integer> f = new Function<Integer, Integer>() {
    public Integer call(Integer x) {
        return x * x;
    }
};
静态函数f=新函数(){
公共整数调用(整数x){
返回x*x;
}
};
并将其传递给映射函数:

JavaRDD<Integer> result = rdd.map(f);
javarddresult=rdd.map(f);

那你可能会没事的。我通常会尝试将转换中要使用的所有函数声明为静态函数(如果它们太大而无法使用lambda形式),这样我就不会在只需要一个函数时意外地序列化整个类。

您的解决方案是有效的。非常感谢。我使用的是Spring,有问题的类是spark.demo.SparkDemoApplication$$EnhancerBySpringCGLIB$$ba2d0007