Я очень смущен, почему это происходит.Я работал над этим в течение некоторого времени, и я просто не понимаю.
Мой код карты работает, поскольку я могу проверить вывод в каталоге, в котором он находится.
Это метод:
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String stateKeyword = value.toString();
String[] pieces = new String[] {stateKeyword};
for (String element : pieces) {
String name = element.split(":")[0].trim();
String id = element.split(":")[1].trim();
Integer rank = Integer.parseInt(element.split(":")[2].trim());
context.write(new Text(name), new Text(id + ":" + rank));
}
}
Итак, мой Output
будет иметь конкатенацию поля id и rank.Я могу видеть это в выходном файле, если я распечатываю значение нормально.
Однако, любая выполняемая мной манипуляция split
выдает ArrayOutOfBoundsException
, и я не могу понять, почему.Я даже делаю проверку, если значение содержит «:», и оно будет печататься, но не будет разделяться.Но когда я не делаю эту проверку, я получаю исключение.
Вот мое уменьшение:
public void Reduce (текстовый ключ, итерируемые значения, контекстный контекст) выдает IOException, InterruptedException {
List<String> elements = new ArrayList<String>();
Text word = new Text();
for (Text val : values) {
if (val.toString().contains(":")) {
String state = val.toString().split(":")[0];
word.set(state);
}
context.write(key, word);
}
}
Мой вывод в моем файле выглядит так:
Name id:rank
Name id:rank
Name id:rank
...
...
...
Но почему я не могу отделить id and rank?