我很困惑为什么会这样。我已经为此工作了一段时间,只是我听不懂。
我的地图代码可以正常工作,因为我可以验证其所在目录中的输出。
这是方法:
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?
答案 0 :(得分:0)
为避免ArrayOutOfBoundsException,请在从数组中获取值之前检查数组的大小。像这样的东西会更合适:
String[] temp = element.split(":");
if(element.size()==2){
String name = temp[0].trim();
String id = temp[1].trim();
}