如果我想在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
什么是构造一个的最佳方法:
org.apache.spark.sql.DataSet[Occupation]
最佳答案
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])
但在实践中几乎没有用。
目前,UDT API提供了另一种可能的方法(Spark
1.6
,2.0
,2.1-SNAPSHOT
),它是私有(private)的,并且需要大量样板代码(您可以检查o.a.s.ml.linalg.VectorUDT
来查看示例实现)。关于scala - 将ADT/密封的特征层次编码为Spark DataSet列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41030073/