我试图在我的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中没有?
答案 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];
}