我很困惑为什么会这样。我已经在这方面工作了一段时间,我只是不明白。
我的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?
1条答案
按热度按时间nc1teljy1#
要避免arrayoutofboundsexception,请在从数组中获取值之前检查数组大小。这样更合适: