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()))
好像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()))