簡體   English   中英

帶有Play-json驗證的Apache Spark Scala

[英]Apache Spark Scala with Play-json Validation

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:不支持Container類型的架構。

Spark不使用Play JSON中的類型類將Scala類型轉換為Spark SQL類型。 相反,您需要查看Spark編碼器 ,它們構成了將Scala類型轉換為Spark類型的基礎。 如果您將Spark Session包含在范圍內,則可以使用import sparkSession.implicits._這樣它將自動為您的案例類創建編碼器。 我相信Spark不支持開箱即用的求和類型,因此您需要實現自己的Encoder以某種方式以臨時方式在Spark中進行建模。 如果要在Spark中編碼求和類型,請閱讀此處以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM