Max*_*ice 2 serialization scala scalaz apache-spark
我注意到大多数Scalaz类都不可序列化.在这种情况下,我正在尝试使用类型类在Spark中自定义排序数组.
减少示例可能是这样的:
> val ord = Order[T]{ ... }
> sc.makeRDD[T](...).grupBy(...).map {
case (_, grouped) => IList[T](grouped.toList).sorted(ord).distinct(ord)
}
Run Code Online (Sandbox Code Playgroud)
正如您所期望的那样,此实现会抛出一个NotSerializableException因为Order[T]不可序列化.
有没有办法使Order[T]序列化?在一个完美的世界里,我希望仍然使用scalaz来避免这个问题.在一个不那么完美的版本中,我愿意考虑其他实现.
如果发生这种情况,必须以可持续和可扩展的方式保持自定义排序和不同的实现.
如果您需要访问某些不可序列化的对象,可以将其包装在object:
scala> class NotSerializablePrinter { def print(msg:String) = println(msg) }
defined class NotSerializablePrinter
scala> val printer = new NotSerializablePrinter
printer: NotSerializablePrinter = $iwC$$iwC$NotSerializablePrinter@3b8afdbf
scala> val rdd = sc.parallelize(Array("1","2","3"))
rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[24] at parallelize at <console>:30
scala> rdd.foreach(msg => printer.print(msg)) // Fails
org.apache.spark.SparkException: Task not serializable
...
scala> object wrap { val printer = new NotSerializablePrinter }
defined module wrap
scala> rdd.foreach(msg => wrap.printer.print(msg))
1
3
2
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您将NotSerializablePrinter使用Scalaz Order实例替换我的实例.这个例子来自这篇有用的文章(第 3a项).
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |