在Java8Lambda中使用Scala原语会导致Spark中出现序列化异常
我正在开发一个使用Java8和Spark 1.5的代码库。我需要与一个Scala库接口,该库返回在Java8Lambda中使用Scala原语会导致Spark中出现序列化异常,java,scala,serialization,apache-spark,Java,Scala,Serialization,Apache Spark,我正在开发一个使用Java8和Spark 1.5的代码库。我需要与一个Scala库接口,该库返回函数[a,B],因此我编写了一个小函数,将函数[a,B]转换为函数[a,B],如下所示 implicit def toJavaFunction[A, B](fn: A => B): Function[A, B] = new Function[A, B] { override def apply(t: A): B = fn(t) } 当我将此函数传递给Spark并且B是AnyVal
函数[a,B]
,因此我编写了一个小函数,将函数[a,B]
转换为函数[a,B]
,如下所示
implicit def toJavaFunction[A, B](fn: A => B): Function[A, B] = new Function[A, B] {
override def apply(t: A): B = fn(t)
}
当我将此函数传递给Spark并且B
是AnyVal
时,例如Long
或Int
会导致序列化异常,但是当我手动将其框入java.lang.Integer
等时,它工作正常
val fn: (e:User) => e.age:java.lang.Integer
因此,下面的示例代码导致异常
case class User(name:String,age:Int)
val fn: (e:User) => e.age
//隐式转换为Java并传递给spark//导致异常
by:java.lang.ClassCastException:无法分配的实例
java.lang.invoke.SerializedLambda到字段
com.a.b.v.aggregators.Aggregator$2.val$fn类型
实例中的java.util.function.function
com.a.b.v.aggregators.聚合器$2.val$fn位于
java.io.ObjectStreamClass$FieldReflector.SetObjJFieldValues(ObjectStreamClass.java:2133)
在
java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1305)
在
ObjectInputStream.defaultReadFields(ObjectInputStream.java:2006)
在
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1924)
但是,如果我执行以下操作,它就可以正常工作
val fn: (e:User) => e.age:java.lang.Integer
是否有一种方法可以修复此问题或强制自动装箱,这样我就不必每次调用函数时都执行e.age:java.lang.Integer