在Hadoop中拆分String,但只得到数组的第一个索引

时间:2017-08-29 10:28:35

标签: java hadoop split reduce

我在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”。我很困惑。有谁有个主意?提前谢谢。

0 个答案:

没有答案