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)
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,看看示例实现).