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

时间:2016-12-08 01:03:26

标签: 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

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

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

2 个答案:

答案 0 :(得分:8)

TL; DR 现在没有好的解决方案,并且在实施Spark SQL / Dataset的情况下,在可预见的将来不太可能有一个。

您可以使用通用kryojava编码器

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

但在实践中几乎没用。

UDT API提供了另一种可能的方法(Spark 1.62.02.1-SNAPSHOT)它是私有的,需要很多样板代码(您可以检查{{1}看示例实现)。

答案 1 :(得分:1)

我曾经深入研究该主题,并创建了一个回购,展示了我发现的所有有用方法。

链接:https://github.com/atais/spark-enum

通常,zero323是正确的,但是您可能会发现了解整个图片很有用。