Apache Spark Scala с проверкой Play-JSON - PullRequest
0 голосов
/ 23 января 2019

java.lang.UnsupportedOperationException: Схема для типа [trait object] не поддерживается

trait Container {
  def aa: String
  def bb: Int
}

case class First(aa: String, bb: Int) extends Container
case class Second(aa: String, bb: Int) extends Container

implicit val aaContainerFormat: Format[First] = Json.format[First]

implicit val bbContainerFormat: Format[Second] = Json.format[Second]

implicit def nodeContainerReads: Reads[Container] =
  try {
    Json.format[First].map(x => x: Container) or
    Json.format[Second].map(x => x: Container)
  } catch {
    case e: Exception => Reads {
      case _ => JsError(JsonValidationError("Cannot De-serialize value."))
    }
  }

implicit def nodeContainerWrites = new Writes[Container] {
  override def writes(node: Container): JsValue = node match {
    case a: First => Json.toJson(a)
    case b: Second => Json.toJson(b)
    case _ => Json.obj("error" -> "wrong Json")
  }
}

// Example Usage....
val spark: SparkSession = SparkSession.builder.appName("Unit Test").getOrCreate()
val js: Container = First("unit", "test")

spark.createDataFrame(Seq(js))

Я ожидаю вывод наборов данных [Container Object], но фактический вывод - java.lang.UnsupportedOperationException:Схема для типа Контейнер не поддерживается.

1 Ответ

0 голосов
/ 24 января 2019

Spark не использует классы типов из Play JSON для преобразования типов Scala в типы Spark SQL. Вместо этого вам нужно взглянуть на Spark Encoders , которые составляют основу преобразований типов Scala в типы Spark. Если у вас есть Spark Session в области действия, вы можете использовать import sparkSession.implicits._, чтобы он автоматически создавал кодировщики для ваших классов дел. Я считаю, что Spark не поддерживает типы сумм из коробки, поэтому вам нужно будет реализовать свой собственный кодер, чтобы каким-то образом моделировать его в Spark. Пожалуйста, прочитайте здесь для получения дополнительной информации, если вы хотите кодировать типы сумм в Spark

...