文本未转换为String Hadoop Java

时间:2017-04-27 22:35:51

标签: java hadoop mapreduce

我试图在我的reduce函数中将Text转换为String但它不起作用。我在Map函数中尝试了相同的逻辑并且它工作得很好,但是当我尝试在我的reduce函数中应用这个逻辑时,它给出了错误:java.lang.ArrayIndexOutOfBoundsException 1

我的地图代码是这样的

public static class OutDegreeMapper2 
    extends Mapper<Object, Text, Text, Text>
{

    private Text word = new Text();
    private Text word2 = new Text();

    public void map(Object key, Text value, Context context
                        ) throws IOException, InterruptedException 
    {
        String oneLine = value.toString();
        String[] parts = oneLine.split("\t");
        word.set(parts[0]);
        String join = parts[1]+",from2";
        word2.set(join);

        context.write(word, word2);
    }
}  

我的缩减功能就像这样

public static class OutDegreeReducer 
    extends Reducer<Text,Text,Text,Text> 
{
    private Text word = new Text();
    String merge ="";
    public void reduce(Text key, Iterable<Text> values, 
                                Context context
                        ) throws IOException, InterruptedException 
    {

        for(Text val:values)
        {

            String[] x = val.toString().split(",");

            if(x[1].contains("from2")){
                merge+= x[0];
            }

        }
        word.set(merge);
        context.write(key, word);
    }
}  

请告诉我为什么split在map函数中工作但在reducer中没有?

2 个答案:

答案 0 :(得分:0)

很可能在这里

String[] parts = oneLine.split("\t");
word.set(parts[0]);
String join = parts[1]+",from2";

或在这里

String[] x = val.toString().split(",");

if(x[1].contains("from2")){
    merge+= x[0];
}

当读取x[1]parts[1]时抛出ArrayIndexOutOfBoundsException,因为字符串中没有,\t

我建议在访问元素1之前检查数组的大小。

查看堆栈跟踪,您应该能够了解抛出异常的位置。

答案 1 :(得分:0)

而不是

  if(x.length() > 1 && x[1].contains("from2")){
        merge+= x[0];
    }

这样做:

if(x.length() > 1 && x[1].contains("from2")){
    merge+= x[0];
}