13

如果我想在 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]
4

2 回答 2

10

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.6, 2.0, 2.1-SNAPSHOT),它是私有的并且需要相当多的样板代码(您可以o.a.s.ml.linalg.VectorUDT查看示例实现)。

于 2016-12-11T02:57:41.687 回答
2

我曾经深入研究过这个主题并创建了一个 repo,展示了我发现的所有可能有用的方法。

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

通常,zero323是正确的,但您可能会发现了解全貌很有用。

于 2020-08-11T16:21:25.890 回答