ArrayIndexOutOfBoundsException in MapReduce



我在MAP部分中获取数组索引越界错误。我的代码如下。我正在尝试从HDFS读取输入文件。有没有更好的方法来读取HDFS文件?

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text>
        {
                private Text key12 = new Text();
                private Text value = new Text();
                public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException
                {
                        String line=value.toString();
                        while((line = value.toString()) != null)
                        {
                                        //StringTokenizer tokenizer = new StringTokenizer(line);
                                        //String field = tokenizer.nextToken();
                                        //
                                        String[] parts= line.split(" ");
                                        if(parts[0].contains("STN") == false)
                                        {
                                                String field=parts[0];
                                                String month=parts[3];
                                                String temp;
                                                if(parts[7].trim().equals(""))
                                                {
                                                        temp=parts[8];
                                                }
                                                else
                                                        temp=parts[7];
                                                //tokenizer.nextToken();
                                                //String month = tokenizer.nextToken();
                                                month=month.substring(4,6);
                                                //String temp = tokenizer.nextToken();
                                                String val = month+temp;
                                                key12.set(field);
                                                value.set(val);
                                                output.collect(key12, value);
                                        }
                        }
        }

不管这个错误在哪里,有很多地方都可能出错。如果parts没有9个元素怎么办?如果它确实有9个元素,但其中一些元素为空,该怎么办?如果line中没有空格字符怎么办?如果month中只有三个字符呢?

处理所有这些情况,您的问题就会得到解决。

顺便说一句,使用

 if(!parts[0].contains("STN"))

而不是

 if(parts[0].contains("STN") == false)

并考虑将一些字符串(如"STN"" ")提取到private static final String变量中。这将大大提高您的性能。

相关内容

  • 没有找到相关文章

最新更新