Во-первых, пробовали ли вы некоторые операции 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.