地图缩小数组越界异常

时间:2019-02-25 05:46:38

标签: java apache hadoop mapreduce

我很困惑为什么会这样。我已经为此工作了一段时间,只是我听不懂。

我的地图代码可以正常工作,因为我可以验证其所在目录中的输出。

这是方法:

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 :(得分:0)

为避免ArrayOutOfBoundsException,请在从数组中获取值之前检查数组的大小。像这样的东西会更合适:

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