Для вашего массива длина массива равна 3 (например, name.length = 3). Но поскольку он хранит элемент, начинающийся с индекса 0, он имеет максимальный индекс 2.
Итак, вместо 'i ** & lt; = name.length' вы должны написать 'i & lt; ** name.length' чтобы избежать «ArrayIndexOutOfBoundsException».
Каждый узел Spark должен загружать классы, необходимые для выполнения вашей логики. В вашем случае это класс с методом countFileWords
Чтобы решить вашу проблему, вы должны сделать следующие шаги:
countFileWords
в отдельный модуль (вам нужен jar-файл с классом, в котором реализован countFileWords
) WordCountService
public void addJar(String path)
public void addJar (String path) Добавляет зависимость JAR для всех задач, которые будут выполняться в этом SparkContext в будущем. Переданный путь может быть либо локальным файлом, файлом в HDFS (или другими файловыми системами, поддерживаемыми Hadoop), либо URI HTTP, HTTPS или FTP.
BLOCKQUOTE>
Проблема в new Function<String, Boolean>()
, это анонимный класс, имеющий ссылку на WordCountService
и переходный на JavaSparkContext
. Чтобы избежать этого, вы можете сделать его статическим вложенным классом.
static class WordCounter implements Function<String, Boolean>, Serializable {
private final String word;
public WordCounter(String word){
this.word = word;
}
@Override
public Boolean call(String s) throws Exception {
return s.contains(word);
}
}
и используйте его с
JavaRDD<String> words = textFile.filter(new WordCounter(word));