2016-12-21 250 views
1

我注意到,大多數斯卡拉斯類不是可序列化的。在這種情況下,我試圖使用類型的類在Spark中對數組進行自定義排序。序列化火花斯卡拉訂單

一個減少的例子可能是這樣的:

> 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這個問題。在不太完美的之一,我打開考慮其他實現。

如果發生這種情況,必須將自定義排序和獨特實現保持爲可持續且可擴展的方式。

+1

雖然這不能解決您的問題,但很高興知道['cats.kernel.Order'](http://typelevel.org/cats/api/cats/kernel/Order.html)是'Serializable' – Odomontois

回答

5

如果您需要訪問一些非序列化對象,你可以在object把它包:

scala> class NotSerializablePrinter { def print(msg:String) = println(msg) } 
defined class NotSerializablePrinter 

scala> val printer = new NotSerializablePrinter 
printer: NotSerializablePrinter = [email protected] 

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(項目3a)中拉出。