scala - 为 Spark 序列化 Scalaz 订单

标签 scala serialization apache-spark scalaz

我注意到大多数 Scalaz 类都不可序列化。在这种情况下,我尝试使用类型类在 Spark 中对数组进行自定义排序。

reduce 的例子可能是这样的:

> val ord = Order[T]{ ... } 
> sc.makeRDD[T](...).grupBy(...).map { 
    case (_, grouped) => IList[T](grouped.toList).sorted(ord).distinct(ord)
  }

如您所料,此实现会抛出 NotSerializableException,因为 Order[T] 不可序列化。

有没有办法让 Order[T] 可序列化?在一个完美的世界中,我希望仍然使用 scalaz 来避免这个问题。在一个不太完美的方案中,我愿意考虑其他实现方案。

如果发生这种情况,则必须以可维护和可扩展的方式保持自定义排序和不同的实现。

最佳答案

如果您需要访问某些不可序列化的对象,您可以将其包装在一个对象中:

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

在您的情况下,您会将我的 NotSerializablePrinter 实例替换为您的 Scalaz Order 实例。此示例来自 this useful article (第 3a 项)。

关于scala - 为 Spark 序列化 Scalaz 订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41271811/

相关文章:

scala - Apache Spark - dataset.dropDuplicates() 是否保留分区?

scala - 如何计算spark中DataFrame中列的百分比?

Scalatest ExecutionContext

scala - 如何在 Lift - Scala 中制作一个片段

json - 如何让 Spark 将 JSON 转义字符串字段解析为 JSON 对象以推断数据帧中的正确结构?

python - 将 Python 对象序列化到/从 S60 手机

c# - 加载/保存数据的替代方法 - 无需序列化?

scala - SBT 0.11 InputKey 取决于其他任务

json - 为没有字段的 Java 枚举创建读/写

java - Springframework 中的单独序列化器