Когда вы объявляете, что new Function
, он содержит ссылку на класс, который его содержит.Когда Spark пытается отправить новый экземпляр анонимной функции рабочим, он также пытается сериализовать содержащий класс, но, очевидно, этот класс не реализует Serializable или имеет другие члены, которые не сериализуются.Вероятно, вы получили ошибку типа object not serializable (class: YourClass, value: YourClass@e49bf8a)
, где «YourClass» - это класс, содержащий объявление функции.
Если вы вместо этого объявили функцию как статический член вашего класса:
static Function<Integer, Integer> f = new Function<Integer, Integer>() {
public Integer call(Integer x) {
return x * x;
}
};
и передал его вашей функции карты:
JavaRDD<Integer> result = rdd.map(f);
тогда, вероятно, все будет в порядке.Я обычно пытаюсь объявить все функции, которые я собираюсь использовать в подобных преобразованиях, как статические (если они слишком велики, чтобы использовать лямбда-форму), поэтому я не случайно запускаю сериализацию целого класса, когда просто хочуодна функция.