在Java8Lambda中使用Scala原语会导致Spark中出现序列化异常

在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

我正在开发一个使用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
时,例如
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