Как создать кодировщик для конструктора типа Option, например Option[Int]?

Можно ли использовать Option[_] член в классе дела, используемого с Dataset API? например. Option[Int]

Я пытался найти пример, но пока не смог найти. Вероятно, это можно сделать с помощью пользовательского кодировщика (отображение?), Но я пока не смог найти пример для этого.

Это может быть достигнуто с помощью библиотеки Frameless: https://github.com/adelbertc/frameless но должен быть простой способ сделать это с помощью базовых библиотек Spark.

Обновить

Я использую: "org.apache.spark" %% "spark-core" % "1.6.1"

И получая следующую ошибку при попытке использовать Option[Int]:

Невозможно найти кодировщик для типа, хранящегося в наборе данных. Примитивные типы (Int, String и т. Д.) И типы Product (классы дел) поддерживаются за счет импорта sqlContext.implicits._ В следующих выпусках будет добавлена ​​поддержка сериализации других типов.

Обновление решения

Поскольку я создавал прототипы, я просто объявлял класс case внутри функции перед преобразованием в набор данных (в моем случае внутри object Main {).

Типы опций работали очень хорошо, когда я переместил класс case за пределы функции Main.

2 ответа

Решение

Мы определяем импликации только для подмножества типов, которые мы поддерживаем в SQLImplicits. Вероятно, мы должны рассмотреть возможность добавления Option[T] для общего T как понимает внутренняя инфраструктура Option, Вы можете обойти это путем создания case class, используя Tuple или создание требуемого неявного самостоятельно (хотя это использует внутренний API, поэтому может сломаться в будущих выпусках).

implicit def optionalInt: org.apache.spark.sql.Encoder[Option[Int]] = org.apache.spark.sql.catalyst.encoders.ExpressionEncoder()

val ds = Seq(Some(1), None).toDS()

"Поддержка сериализации других типов будет добавлена ​​в будущих выпусках". Пользовательские кодировщики пока не поддерживаются, хотя, очевидно, это планируется. Вы можете попытаться реализовать эту черту самостоятельно, но официальных примеров нет.

Одним из вариантов будет использование Seq[Int] член и убедитесь, что он имеет не более одного значения.

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