Как построить кодировщик в java - PullRequest
0 голосов
/ 20 февраля 2020

Я реализую искровой процесс в java и хочу сделать из RDD того же параметризованного типа Dataset<Try<MyPojo>> для некоторого собственного класса MyPojo, где Try - это scala Try. В scala кодировщик будет создан неявно, но в java мне нужно предоставить его явно.

Теперь я могу получить рабочий Encoder<MyPojo>, используя Encoders.bean(MyPojo.class). И я ожидаю, что есть некоторый код для построения Encoder<Try<T>> из Encoder<T>, который используется неявным scala. Но я не могу его найти.

[Примечание: я только что попробовал в scala и не было найдено неявного для типа Try ... Так что вопрос действителен и в scala]

Итак, как мне быть?

1 Ответ

0 голосов
/ 20 февраля 2020

После некоторых поисков я пришел к выводу, что

  1. это невозможно (или может быть, но это будет слишком сложно)
  2. , и это потому, что это не способ использовать Набор данных

Сначала я считал набор данных супер, более обобщенной c версией СДР. Но это не так. На самом деле, он менее универсален c по отношению к типу, потому что тип, хранящийся в наборе данных, должен быть «плоским» или «сплющенным».

Традиционные Pojo имеют либо плоскую структуру (каждое поле имеет значение тип, который может быть представлен одним столбцом) или может быть сведен, когда поля имеют тип Pojo. С другой стороны, не существует тривиального способа «сгладить» тип, такой как Try, который по сути является либо каким-либо типом (в вопросе MyPojo), либо исключением.

И этот вывод также применим ко всем -pojo тип, такой как интерфейсы, которые могут иметь несколько реализаций. Очевидно, это приводит к вопросу: как насчет классов, которые не являются pojo, например. потому что это содержит поле Try или тип интерфейса. Вероятно, что Encoders.bean потерпит неудачу во время выполнения. Так много для безопасности типов ...

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

...