map reduce数组越界异常

7vhp5slm  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(466)

我很困惑为什么会这样。我已经在这方面工作了一段时间,我只是不明白。
我的Map代码的工作原理是,我能够在它所在的目录中验证输出。
方法如下:

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(text key,iterable value,context context)抛出ioexception,interruptedeexception{

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?

nc1teljy

nc1teljy1#

要避免arrayoutofboundsexception,请在从数组中获取值之前检查数组大小。这样更合适:

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

相关问题