Несериализуемая ошибка SortedMap в наборе данных Spark

Кажется, что 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: файл 'generated.java', строка 116, столбец 100: не найден применимый конструктор/метод для фактических параметров "scala.collection.Map"; кандидатами являются: "com.caspida.algorithms.security.offline.exfilterthreat.MyClass(scala.collection.SortedMap)"


person happy_C3    schedule 22.03.2017    source источник


Ответы (1)


Поддерживаемые типы Scala для Spark (начиная с версии 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()))
person marios    schedule 22.03.2017