Кодировать иерархию ADT / запечатанных признаков в столбец Spark DataSet
Если я хочу сохранить алгебраический тип данных (ADT) (т. Е. Иерархию запечатанных признаков Scala) в столбце Spark DataSet, какова лучшая стратегия кодирования?
Например, если у меня есть 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]
1 ответ
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
чтобы увидеть пример реализации).
Однажды я глубоко погрузился в эту тему и создал репо, демонстрирующее все подходы, которые, как я нашел, могут быть полезными.
Ссылка: https://github.com/atais/spark-enum
Как правило, zero323 правильный, но вам может быть полезно понять полную картину.