我在hadoop中遇到了一个关于split方法的问题。非常简单的代码如下:
public static class Reduce extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for (Text each : values) {
String[] array = each.toString().split(",");
context.write(key, new Text(array[1]));
}
}
}
值是这样的字符串:“a,0,0,1”。我想做的是尝试拆分这个字符串并将它们放入一个数组中。如果我执行上面的代码,它将显示arrayoutofindexexception。但是我可以访问索引0的数组,它将返回一个“a”。我想弄清楚,然后把“array[1]”部分改为“integer.tostring(array.length)”。结果它返回1。我很困惑。我很确定输入数据是正确的,没有空值,没有更多的空格。
当我把代码改为:
public static class Reduce extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for (Text each : values) {
for (String eachPart: each.toString().split(",")){
context.write(key, new Text(eachPart));
}
}
}
}
它可以返回输入的每一个值,结果如下(假设键为“0,0”):
0,0 A
0,0 0
0,0 0
0,0 1
但当我再次尝试把它放到这样的数组中时:
public static class Reduce extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for (Text each : values) {
int i = 0;
String[] tmp = new String[4];
for (String eachPart: each.toString().split(",")){
tmp[i] = eachPart;
i++;
context.write(key, new Text(tmp[1]));
}
}
}
}
我无法获取数组,它将是nullpointerexception。如果我把“tmp[1]”改为“tmp[0]”,就可以了,它会返回一个“a”。我很困惑。有人有主意吗?提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!