Scala Apache Spark 2.0:java.lang.UnsupportedOperationException:未找到java.time.LocalDate的编码器

Scala Apache Spark 2.0:java.lang.UnsupportedOperationException:未找到java.time.LocalDate的编码器,scala,apache-spark,apache-spark-sql,apache-spark-dataset,apache-spark-encoders,Scala,Apache Spark,Apache Spark Sql,Apache Spark Dataset,Apache Spark Encoders,我正在使用ApacheSpark2.0并创建case类,用于DetaSet的模式。当我试图根据定义自定义编码器时,对于java.time.LocalDate我遇到了以下异常: java.lang.UnsupportedOperationException: No Encoder found for java.time.LocalDate - field (class: "java.time.LocalDate", name: "callDate") - root class: "FireServ

我正在使用ApacheSpark2.0并创建
case类
,用于
DetaSet
的模式。当我试图根据定义自定义编码器时,对于
java.time.LocalDate
我遇到了以下异常:

java.lang.UnsupportedOperationException: No Encoder found for java.time.LocalDate
- field (class: "java.time.LocalDate", name: "callDate")
- root class: "FireService"
at org.apache.spark.sql.catalyst.ScalaReflection$.org$apache$spark$sql$catalyst$ScalaReflection$$serializerFor(ScalaReflection.scala:598)
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$9.apply(ScalaReflection.scala:592)
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$9.apply(ScalaReflection.scala:583)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
............
以下按代码列出:

case class FireService(callNumber: String, callDate: java.time.LocalDate)
implicit val localDateEncoder: org.apache.spark.sql.Encoder[java.time.LocalDate] = org.apache.spark.sql.Encoders.kryo[java.time.LocalDate]

val fireServiceDf = df.map(row => {
val dateFormatter = java.time.format.DateTimeFormatter.ofPattern("MM/dd /yyyy")
FireService(row.getAs[String](0),  java.time.LocalDate.parse(row.getAs[String](4), dateFormatter))
})
我们如何为spark定义第三方api的编码器

更新

当我为整个case类创建编码器时,
df.map..
将对象映射为二进制,如下所示:

implicit val fireServiceEncoder: org.apache.spark.sql.Encoder[FireService] = org.apache.spark.sql.Encoders.kryo[FireService]

val fireServiceDf = df.map(row => {
 val dateFormatter = java.time.format.DateTimeFormatter.ofPattern("MM/dd/yyyy")
 FireService(row.getAs[String](0), java.time.LocalDate.parse(row.getAs[String](4), dateFormatter))
})

fireServiceDf: org.apache.spark.sql.Dataset[FireService] = [value: binary]

我期待FireService的map,但返回map的二进制。

正如最后一条评论所说,“如果类包含一个字段栏,则需要为整个对象提供编码器。”您需要为
FireService
本身提供隐式编码器;否则,Spark将使用
SQLImplicits.newProductEncoder为您构建一个[T Hey@Alexey我明白你的意思了,我还是不明白确切的原因,为什么我们需要完整的对象格式化程序?我明白了。我也更新了这个问题,因为现在我的数据被转换成二进制。当我使用时间戳而不是LocalDate时,dataschema构建为FireService,否则作为二进制。请作为单独的问题提问。一般来说,不要编辑一个问题而问另一个问题。@AlexeyRomanov我面临着同样的问题。你有一个如何编码整个项目的代码示例吗?非常感谢!