首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Play-json验证的Apache Spark Scala

带有Play-json验证的Apache Spark Scala
EN

Stack Overflow用户
提问于 2019-01-23 18:24:42
回答 1查看 190关注 0票数 0

java.lang.UnsupportedOperationException:不支持类型特征对象的架构

代码语言:javascript
复制
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))

我期望容器对象的数据集的输出,但实际输出是java.lang.UnsupportedOperationException:不支持容器类型的架构。

EN

回答 1

Stack Overflow用户

发布于 2019-01-24 11:24:37

Spark不使用Play JSON中的类型类将Scala类型转换为Spark SQL类型。相反,您需要查看Spark Encoders,它构成了将Scala类型转换为Spark类型的基础。如果你有Spark Session在作用域中,你可以使用import sparkSession.implicits._,这样它就会自动为你的case类创建编码器。我相信Spark不支持开箱即用的sum类型,所以你需要实现你自己的编码器,以某种方式在Spark中以一种特别的方式建模。如果您想在Spark中编码sum类型,请阅读here了解更多信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54325045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档