MapReduce 中的 ArrayIndexOutOfBoundsException
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
中没有 space 字符怎么办?如果month
里面只有三个字符怎么办?
处理所有这些情况,您的问题就会得到解决。
顺便说一句,使用
if(!parts[0].contains("STN"))
而不是
if(parts[0].contains("STN") == false)
并考虑将您的一些字符串(例如 "STN"
和 " "
提取到 private static final String
变量中。这将大大提高您的性能。
我在 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
中没有 space 字符怎么办?如果month
里面只有三个字符怎么办?
处理所有这些情况,您的问题就会得到解决。
顺便说一句,使用
if(!parts[0].contains("STN"))
而不是
if(parts[0].contains("STN") == false)
并考虑将您的一些字符串(例如 "STN"
和 " "
提取到 private static final String
变量中。这将大大提高您的性能。