Сериализация Java-объектов в Scala - PullRequest
0 голосов
/ 17 января 2019

Простите меня, поскольку я новичок в Скале. Я создал класс case, который инкапсулирует некоторую информацию. Один из объектов, которые я хочу использовать, - JavaClass. Поскольку я использую в искре, мне нужно, чтобы он был сериализуемым. Как я могу это сделать?

класс Java

public class Currency {

    public Currency(final BigDecimal amount, final CurrencyUnit unit) {
        //Doing Something
    }
}

case class ReconEntity(inputCurrency : Currency, outputCurrency : Currency)

Используя неявное, я хочу иметь свой код сериализации для валюты, чтобы спарк мог работать на ReconEntity.

1 Ответ

0 голосов
/ 17 января 2019

Во-первых, пробовали ли вы некоторые операции RDD с использованием классов Currency и ReconEntity? Вы действительно получаете ошибку? Spark может обрабатывать операции RDD с явно не сериализуемыми классами Scala в качестве значений, по крайней мере (вы можете попробовать это в spark-shell, хотя, возможно, для этого может потребоваться включить сериализатор Kryo ).

Поскольку вы заявляете, что не владеете классом Currency, вы не можете добавить extends Serializable, что было бы самым простым решением.

Другой подход состоит в том, чтобы обернуть класс в сериализуемую оболочку, как описано в этой статье: Превышение сериализации в Spark - пример кода, скопированный здесь для удобства:

Для простых классов проще всего создать интерфейс-обертку, который расширяет Сериализуемый. Это означает, что хотя UnserializableObject не может быть сериализовано, мы можем передать следующий объект без каких-либо выпуск

public interface UnserializableWrapper extends Serializable {
  public UnserializableObject create(String prm1, String prm2);
}

Затем объект можно передать в функцию RDD или Map, используя следующий подход

UnserializableWrapper usw = new UnserializableWrapper() {
  public UnserializableObject create(String prm1, String prm2) {
    return new UnserializableObject(prm1,prm2);
} }

Если класс представляет собой просто структуру данных без значительных методов, то может быть проще распаковать его поля в типы RDD (в вашем случае ReconEntity) и удалить сам класс.

Если у класса есть методы, которые вам нужны, тогда другой (безобразный) вариант - вырезать и вставлять код в новый сериализуемый класс или во вспомогательные функции в вашем коде Spark.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...