Spark 数据集中的 SortedMap 不可序列化错误

SortedMap non serializable error in Spark Dataset

好像scala.collection.SortedMap不是可序列化的?

简单代码示例:

case class MyClass(s: scala.collection.SortedMap[String, String] = SortedMap[String, String]())

object MyClass {
  def apply(i: Int): MyClass = MyClass()
}

import sparkSession.implicits._

List(MyClass(1), MyClass()).toDS().show(2)

会 return:

+-----+
|    s|
+-----+
|Map()|
|Map()|
+-----+

另一方面,take() 会在执行时惨败:

List(MyClass(1), MyClass()).toDS().take(2)

错误 codegen.CodeGenerator:编译失败:org.codehaus.commons.compiler.CompileException:文件 'generated.java',第 116 行,第 100 列:未找到实际参数 constructor/method "scala.collection.Map" ];候选人是:"com.caspida.algorithms.security.offline.exfiltrationthreat.MyClass(scala.collection.SortedMap)"

Spark 支持的 Scala 类型(从 2.1.0 开始)不包括 scala.collection.SortedMap)。可在此处找到受支持类型的列表:

https://spark.apache.org/docs/latest/sql-programming-guide.html#data-types

正如 link 所建议的那样,地图支持的类型是 scala.collection.Map 因此以下工作:

case class MyClass(s: scala.collection.Map[String, String] = SortedMap[String, String]())


scala> spark.createDataset( MyClass() :: Nil ).collect()
res: Array[MyClass2] = Array(MyClass(Map()))