Scala 将ADT/密封特征层次结构编码到Spark数据集列中

Scala 将ADT/密封特征层次结构编码到Spark数据集列中,scala,apache-spark,apache-spark-dataset,apache-spark-encoders,Scala,Apache Spark,Apache Spark Dataset,Apache Spark Encoders,如果我想在Spark列中存储代数数据类型(ADT)(即Scala密封的特征层次结构),那么最好的编码策略是什么 例如,如果我有一个ADT,其中叶类型存储不同类型的数据: sealed trait Occupation case object SoftwareEngineer extends Occupation case class Wizard(level: Int) extends Occupation case class Other(description: String) extend

如果我想在Spark列中存储代数数据类型(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
构建一个网络的最佳方式是什么:

org.apache.spark.sql.DataSet[Occupation]

TL;DR目前没有好的解决方案,考虑到Spark SQL/
数据集的实施,在可预见的未来不太可能有好的解决方案

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

val occupation: Seq[Occupation] = Seq(SoftwareEngineer, Wizard(1), Other("foo"))
spark.createDataset(occupation)(org.apache.spark.sql.Encoders.kryo[Occupation])
但在实践中几乎没有用处


UDT API目前提供了另一种可能的方法(Spark
1.6
2.0
2.1-SNAPSHOT
),它是私有的,需要大量的样板代码(您可以查看
o.a.s.ml.linalg.VectorUDT
以查看示例实现).

我曾经深入探讨过这个问题,并创建了一个回购协议,展示了我发现的所有可能有用的方法

链接:

一般来说,这是正确的,但您可能会发现了解全貌很有用