文本未转换为字符串Hadoop Java

文本未转换为字符串Hadoop Java,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我试图在reduce函数中将文本转换为字符串,但它不起作用。我在Map函数中尝试了相同的逻辑,它工作得很好,但当我尝试在reduce函数中应用此逻辑时,它给出了错误:java.lang.ArrayIndexOutOfBoundsException 1 我的地图代码是这样的 public static class OutDegreeMapper2 extends Mapper<Object, Text, Text, Text> { private Text word

我试图在reduce函数中将文本转换为字符串,但它不起作用。我在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);
    }
}  
我的reduce函数是这样的

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中工作?

很可能在这里

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]或部分[1]时,会抛出ArrayIndexOutOfBoundsException,因为字符串中没有、和\t

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

查看stacktrace,您应该能够理解异常的抛出位置。

而不是

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

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

需要stacktrace,ArrayIndexOutOfBoundsException:这意味着您正在尝试访问数组中不存在的索引。没有更多的stacktrace,我在这里无能为力。你能告诉我stacktrace是什么意思吗?我对编程很陌生,所以不太了解。奇怪的是,这个拆分函数在Map函数中工作得很好,但在reducer函数中却不工作。我甚至用val.toString.containsfrom2检查了它以进行验证,但它甚至没有选择它。我的输出显示键的空值。请用您提供的输入文本回答您的问题StackTrace=>如果您不熟悉Java并调试它,那么我不建议学习MapReduce您提到的第一部分工作得很好,我通过删除reducer中的If条件对其进行了交叉检查。它从2开始,按着键打印。但是,当我试图通过将文本转换为字符串来拆分文本或尝试检查函数val.toString.contains时,它不起作用。奇怪的是,它在map Function中工作,但在reduce中不工作。你说有ArrayIndexOutOfBoundsException,对吗?如果split返回的数组小于2个元素,则抛出ArrayIndexOutOfBoundsException。我在你的代码中只看到了两个可能发生这种情况的地方。如果x[1].containsfrom2,只需在语句中添加一个类似于x.length>1&&x[1].containsfrom2的检查。对其他部分[1]也做同样的操作当我直接向代码中添加x[0]时,它起了作用。输出显示从1到键。但是当我尝试使用val.toString.Contains from2时,它不起作用。斯普利特也是这样。拆分和包含在此不起作用等待您答复先生:我尝试使用x.length函数,它给出以下错误BFS.java:110:error:找不到符号int j=x.length;