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

问题描述 投票:0回答:3

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

构建 a 的最佳方法是什么:

org.apache.spark.sql.DataSet[Occupation]
scala apache-spark apache-spark-dataset apache-spark-encoders
3个回答
11
投票

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


2
投票

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

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

一般来说,zero323是正确的,但您可能会发现它有助于理解完整的情况。


0
投票

供任何尝试此操作的人参考:https://stackoverflow.com/a/78333976/1028537,无帧编码器推导有效。

© www.soinside.com 2019 - 2024. All rights reserved.