Я добавляю List<String>
к моей функции уменьшения.
Данные в List<String>
выглядят как
"banana:1"
"apple:3"
"carrot:2"
"ballon:1"
"cake:4"
"banana:14"
"apple:3"
"carrot:22"
"ballon:11"
"cake:9"
"banana:7"
"apple:6"
"carrot:5"
"ballon:3"
"cake:2"
Я хочу, чтобы мои Reduce
получили максимум #String.split(":")[0]
для каждого пятого элемента и собрать соответствующее слово.Таким образом, связанные слова будут cake, carrot, banana
, так как они являются самыми высокими баллами для каждого пятого элементаПри этом cake, carrot, and banana
каждый получит +1.Я хочу перебрать весь свой List
, чтобы увидеть, сколько + 1 имеет каждое слово.
В настоящее время я получаю ошибку ArrayIndexOutOfBounds
в своем Reducer
, и я не уверен, почему.
Это мое сокращение:
Text mainKeyword = new Text();
@Override
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> outputCollector, Reporter reporter)
throws IOException {
List<String> copies = new ArrayList<String>();
String keyword = key.toString().split(":")[0];
Integer score = Integer.parseInt(key.toString().split(":")[1]);
int total = 0;
while (values.hasNext()) {
String keywordAndValue = key.toString();
total += values.next().get();
copies.add(keywordAndValue);
}
int maxIndex = 1;
int count = 0;
for (int i = 1; i < copies.size() + 1; i++) {
if (Integer.parseInt(copies.get(i - 1).split(":")[1]) > Integer.parseInt(copies.get(maxIndex - 1).split(":")[1])) {
maxIndex = i;
}
if (i % 4 == 0) {
mainKeyword.set(new Text(copies.get(maxIndex - 1).split(":")[0]));
count += 1;
maxIndex = i + 1;
}
}
outputCollector.collect(new Text(score.toString()), new IntWritable(count));
}
Исключение составляет if (Integer.parseInt(copies.get(i - 1).split(":")[1]) > Integer.parseInt(copies.get(maxIndex - 1).split(":")[1]))
, но каждая моя строка такая, как описано: "word:#
", поэтому теоретически разделение должно работать.