Закодируйте иерархию 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]

person Ben Hutchison    schedule 08.12.2016    source источник


Ответы (2)


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, чтобы увидеть пример реализации).

person zero323    schedule 11.12.2016
comment
почему крио вряд ли пригодится на практике? Это потому, что мы должны указывать сериализатор kryo после каждого преобразования? - person user2103008; 29.06.2021

Однажды я глубоко погрузился в эту тему и создал репо, демонстрирующее все подходы, которые, как я нашел, могут быть полезными.

Ссылка: https://github.com/atais/spark-enum

Как правило, zero323 является правильным, но вы можете найти его полезным для понимания полной картины.

person Atais    schedule 11.08.2020