Кодировать иерархию 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 правильный, но вам может быть полезно понять полную картину.

Другие вопросы по тегам