Scala case类的无样板投影以更改枚举的数据类型

Scala case类的无样板投影以更改枚举的数据类型,scala,apache-spark,projection,case-class,enumeratum,Scala,Apache Spark,Projection,Case Class,Enumeratum,我有一个Enumeratum enum,需要将其加载到spark数据帧中。显然,这是由于缺少编码器而失败的 import enumeratum._ sealed trait Foo extends EnumEntry object Foo extends Enum[Foo] { val values = findValues case object Baz extends Foo case object Bar extends Foo } case class FooBar(a

我有一个Enumeratum enum,需要将其加载到spark数据帧中。显然,这是由于缺少编码器而失败的

import enumeratum._
sealed trait Foo extends EnumEntry

object Foo extends Enum[Foo] {

  val values = findValues

  case object Baz extends Foo
  case object Bar extends Foo
}
case class FooBar(a:Int, lotOfOthterFields:String, xxxx:Seq[Foo])
Seq(FooBar(1, "one", Foo.Baz), FooBar(2, "two", Foo.Bar)).toDF
失败,未找到Foo类型的编码器。 如何将案例类(无样板)投影到:

  • 要么让它在spark中正常工作(我不想),要么就要二进制kryo输出
  • 或者通过
    Foo.Baz.entryName
    (但不需要定义类似的类)将其转换为一个字符串,类似于
    Seq(FooBar(1,“one”,Foo.Baz),FooBar(2,“two”,Foo.Bar)).map(allValluesButxxxx,xxxx.entryName)

到目前为止,我只能求助于应用Enum的entryName(字符串),但这是次优的;这不允许您使用enumeratum,但至少可以正确序列化: