Обобщение обсуждения, которое произошло в комментариях, для формирования ответа. Когда вы пытаетесь вызвать преобразование, драйвер Spark должен создать и отправить закрытие для кода в рамках этого преобразования исполнителю (-ям), который отвечает за него.для запуска этого.В вашем случае строка кода Class3 class3 = Class3.getInstance();
является частью объекта Scala, который включает в себя создание и использование контекста Spark для получения какого-либо результата, приложения-драйвера.Следовательно, когда вы пытаетесь передать class3
в преобразовании карты, драйвер пытается сериализовать включающий объект Scala.Этот объект scala сам по себе не является сериализуемым, если вы не реализуете сериализуемость, следовательно, вы получаете проблему с сериализацией.
Re: Сериализация Kryo. Поскольку вы зарегистрировали свой Class3 в Kryo, он поможет вам сериализовать экземпляр Class3, однако он не будет сериализовать объект Composite, в котором экземпляр Class3 является переменной.
Следовательно, если вы извлекаете значение class3.getId()
и затем передаете его преобразованию своей карты, вам не нужно регистрировать Class3 в Kryo.
В вашем примере с объектом Scala, о котором я упоминалвыше то же самое, что и приложение для драйвера.
Надеюсь, это поможет.