Карта уменьшает исключение массива за пределы границ - PullRequest
0 голосов
/ 25 февраля 2019

Я очень смущен, почему это происходит.Я работал над этим в течение некоторого времени, и я просто не понимаю.

Мой код карты работает, поскольку я могу проверить вывод в каталоге, в котором он находится.

Это метод:

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?

1 Ответ

0 голосов
/ 25 февраля 2019

Чтобы избежать ArrayOutOfBoundsException, проверьте размер массива, прежде чем получать значение из массива.Примерно так будет более уместно:

    String[] temp = element.split(":"); 
    if(element.size()==2){
       String name = temp[0].trim(); 
       String id = temp[1].trim();
     }
...