我在Hadoop中遇到了分裂方法的有线问题。这是非常简单的代码:
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”。我想要做的是尝试拆分这个String并将它们放入一个数组中。如果我执行上面的代码,它将显示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”。我很困惑。有谁有个主意?提前谢谢。