无形ToTraversable不可序列化

时间:2017-08-27 23:02:35

标签: scala apache-spark shapeless

我想在Spark HList中使用Shapeless中的RDD,我想使用需要以下隐含的toList方法:

implicit ev2: ToTraversable.Aux[InType, List, OutType]

但是,如果我将此隐式传递给RDD,则会抛出NotSerializableException

Caused by: java.io.NotSerializableException: scala.collection.generic.GenTraversableFactory$$anon$1
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)

是否有另一种方法可以在Shapeless中实现toList,或者提供一种可序列化的隐式方法?

1 个答案:

答案 0 :(得分:1)

在阅读了我在tests中找到的一些无形代码后,解决方法是将此隐式CanBuildFrom放在ToTraversable的范围内:

  implicit def listSerializableCanBuildFrom[T]: CanBuildFrom[List[T], T, List[T]] =
    new CanBuildFrom[List[T], T, List[T]] with Serializable {
      def apply(from: List[T]) = from.genericBuilder[T]

      def apply() = List.newBuilder[T]
    }