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

时间:2017-03-22 23:26:20

标签: scala apache-spark apache-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)

将返回:

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

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

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

错误codegen.CodeGenerator:编译失败:org.codehaus.commons.compiler.CompileException:File' generated.java',第116行,第100列:找不到适用于实际参数的构造函数/方法& #34; scala.collection.Map&#34 ;;候选人是:" com.caspida.algorithms.security.offline.exfiltrationthreat.MyClass(s​​cala.collection.SortedMap)"

1 个答案:

答案 0 :(得分:0)

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

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

正如链接所示,地图支持的类型为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()))