【发布时间】:2018-06-19 10:48:06
【问题描述】:
我有一些数据存储为 parquet 文件和与数据模式匹配的案例类。 Spark 可以很好地处理常规产品类型,所以如果我有
case class A(s:String, i:Int)
我可以轻松做到
spark.read.parquet(file).as[A]
但据我了解,Spark 不处理析取类型,所以当我在镶木地板中有枚举时,以前编码为整数,以及像这样的 scala 表示
sealed trait E
case object A extends E
case object B extends E
我做不到
spark.read.parquet(file).as[E]
// java.lang.UnsupportedOperationException: No Encoder found for E
到目前为止是有道理的,但是,可能太天真了,我尝试了
implicit val eEncoder = new org.apache.spark.sql.Encoder[E] {
def clsTag = ClassTag(classOf[E])
def schema = StructType(StructField("e", IntegerType, nullable = false)::Nil)
}
我仍然得到相同的“找不到 E 编码器”:(
此时我的问题是,为什么范围内的隐含缺失? (或不被识别为编码器[E]),即使是这样,这样的接口如何允许我实际解码数据?我仍然需要将值映射到正确的案例对象。
我确实读过a related answer,上面写着“TL;DR 目前没有好的解决方案,鉴于 Spark SQL / Dataset 的实施,在可预见的将来不太可能有这样的解决方案。”但我很难理解为什么自定义编码器无法做到这一点。
【问题讨论】:
标签: scala apache-spark apache-spark-sql