【问题标题】:Serializing Scalaz Order for Spark为 Spark 序列化 Scalaz 顺序
【发布时间】:2017-05-07 09:50:44
【问题描述】:

我注意到大多数 Scalaz 类是不可序列化的。在这种情况下,我尝试使用 type class 对 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。在一个不太完美中,我愿意考虑其他实现。

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

【问题讨论】:

  • 虽然这不能解决您的问题,但很高兴知道cats.kernel.OrderSerializable

标签: scala serialization apache-spark scalaz


【解决方案1】:

如果您需要访问某些不可序列化的对象,您可以将其包装在 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

在您的情况下,您可以用您的 Scalaz Order 实例替换我的 NotSerializablePrinter 实例。这个例子来自this useful article(item 3a)。

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 2018-11-10
    • 2020-06-13
    • 2018-07-08
    • 2014-06-30
    • 2020-03-04
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多