Как создать кодировщик для конструктора типа 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]
член и убедитесь, что он имеет не более одного значения.