将ADT /密封特征层次结构编码到Spark DataSet列中

Ben*_*son 10 scala apache-spark apache-spark-dataset apache-spark-encoders

如果我想在Spark DataSet列中存储代数数据类型(ADT)(即Scala密封特征层次结构),那么最佳编码策略是什么?

例如,如果我有一个ADT,其中叶子类型存储不同类型的数据:

sealed trait Occupation
case object SoftwareEngineer extends Occupation
case class Wizard(level: Int) extends Occupation
case class Other(description: String) extends Occupation
Run Code Online (Sandbox Code Playgroud)

什么是构建一个最好的方法:

org.apache.spark.sql.DataSet[Occupation]
Run Code Online (Sandbox Code Playgroud)

use*_*411 8

TL; DR现在没有好的解决方案,并且鉴于Spark SQL/Dataset实现,在可预见的未来不太可能存在.

您可以使用通用kryo或java编码器

val occupation: Seq[Occupation] = Seq(SoftwareEngineer, Wizard(1), Other("foo"))
spark.createDataset(occupation)(org.apache.spark.sql.Encoders.kryo[Occupation])
Run Code Online (Sandbox Code Playgroud)

但在实践中几乎没用.

UDT API提供了另一种可能的方法是现在(火花1.6,2.0,2.1-SNAPSHOT)它是私有的,需要相当多的样板代码(你可以检查o.a.s.ml.linalg.VectorUDT,看看示例实现).

  • 为什么 kryo 在实践中几乎没有用处?是因为我们每次转换后都必须指定 kryo 序列化器吗? (2认同)