使用Java减少边连接ArrayIndexOutOfBounds异常

使用Java减少边连接ArrayIndexOutOfBounds异常,java,exception,mapreduce,Java,Exception,Mapreduce,正在尝试在3个数据集上运行Reduce-Side连接。不幸的是,我一直收到ArrayIndex异常。我试着用try&Catch来处理它,但没有用。有人能推荐一个解决方案吗 package Joins; import java.io.IOException; import java.util.*; import java.util.Map.Entry; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.Reduc

正在尝试在3个数据集上运行Reduce-Side连接。不幸的是,我一直收到ArrayIndex异常。我试着用try&Catch来处理它,但没有用。有人能推荐一个解决方案吗

package Joins;

import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Reducer;

public class JoinReducer extends Reducer<Text, Text, Text, Text> 
{
Map<String, String> divStkJoin = new HashMap<String, String>();
Map<String, String> divStkMetaJoin = new HashMap<String, String>();
Map<String, String> stockData = new HashMap<String, String>();
Map<String, String> metaData = new HashMap<String, String>();
Map<String, String> divData = new HashMap<String, String>();
Text k = new Text();
Text v = new Text();

public void setup(Context context)
{   
    metaData.clear();
    divData.clear();
    stockData.clear();
    divStkJoin.clear();
    divStkMetaJoin.clear();
}

public void reduce(Text keys, Iterable<Text> values, Context context)
{

    Iterator it = values.iterator();

    while(it.hasNext()){
    String [] keyLine = keys.toString().split(","); 
    String valueLine = values.toString();

    try {

        if(keyLine[4].equals("_s"))
        {
            String keyLineStock = keyLine[0] + "," + keyLine[1] +"," + keyLine[2] + "," +   keyLine[3];
            stockData.put(keyLineStock, valueLine);

        }
        else if(keyLine[4].equals("_d"))
        {
            String keyLineDiv = keyLine[0] + "," + keyLine[1] +"," + keyLine[2] + "," + keyLine[3];
             divData.put(keyLineDiv, valueLine);
        }

        else if (keyLine[1].equals("_m"))
        {
            String keyLineMeta = keyLine[0];
            metaData.put(keyLineMeta, valueLine);
        }
        else
            return;

    } catch (ArrayIndexOutOfBoundsException e){return;}
    }   



        //JOINS

        for(Entry<String, String> entryStock: stockData.entrySet())
            for(Entry<String, String> entryDiv: divData.entrySet())
                {
                    if(entryStock.getKey().equals(entryDiv.getKey()))
                    {
                        divStkJoin.put(entryStock.getKey(), entryStock.getValue()+ ","+ entryDiv.getValue());
                    }
                }
        for(Entry<String, String> entrydivStkJoin: divStkJoin.entrySet())
        {
            String [] entrydivStkJoinKeyArr = entrydivStkJoin.getKey().toString().split(",");
            for(Entry<String, String> meta: metaData.entrySet())    
            {
                String [] metaArr = meta.getKey().split(",");

                if(metaArr[0].equals(entrydivStkJoinKeyArr[1]))
                {
                    divStkMetaJoin.put(entrydivStkJoin.toString(), meta.getValue());
                }
            }
        }
    }   



public void cleanup(Context context) throws IOException, InterruptedException
{

        String keyJ;
        String valJ;
    for(Map.Entry<String, String> entry : divStkMetaJoin.entrySet())
    {
        keyJ=entry.getKey();
        valJ=entry.getValue();
        Text k = new Text(keyJ);
        Text v = new Text(valJ);

        context.write(k, v);
    }
}
包连接;
导入java.io.IOException;
导入java.util.*;
导入java.util.Map.Entry;
导入org.apache.hadoop.io.*;
导入org.apache.hadoop.mapreduce.Reducer;
公共类JoinReducer扩展了Reducer
{
Map divStkJoin=newhashmap();
Map divStkMetaJoin=newhashmap();
Map stockData=newhashmap();
映射元数据=新建HashMap();
Map divData=newhashmap();
文本k=新文本();
Text v=新文本();
公共无效设置(上下文)
{   
metaData.clear();
divData.clear();
stockData.clear();
divStkJoin.clear();
divStkMetaJoin.clear();
}
公共void reduce(文本键、Iterable值、上下文)
{
迭代器it=values.Iterator();
while(it.hasNext()){
字符串[]keyLine=keys.toString().split(“,”);
字符串valueLine=values.toString();
试一试{
if(键线[4]。等于(“\s”))
{
字符串keyLineStock=keyLine[0]+“,“+keyLine[1]+”,“+keyLine[2]+”,“+keyLine[3];
stockData.put(keyLineStock,valueLine);
}
else if(关键字[4]。等于(“\u d”))
{
字符串keyLineDiv=keyLine[0]+“,“+keyLine[1]+”,“+keyLine[2]+”,“+keyLine[3];
divData.put(keyLineDiv,valueLine);
}
else if(关键字[1]。等于(“\m”))
{
字符串keyLineMeta=keyLine[0];
metaData.put(keyLineMeta、valueLine);
}
其他的
返回;
}catch(ArrayIndexOutOfBoundsException e){return;}
}   
//加入
对于(条目entryStock:stockData.entrySet())
对于(条目entryDiv:divData.entrySet())
{
if(entryStock.getKey().equals(entryDiv.getKey()))
{
divStkJoin.put(entryStock.getKey(),entryStock.getValue()+”,“+entryDiv.getValue());
}
}
对于(条目entrydivStkJoin:divStkJoin.entrySet())
{
字符串[]entrydivStkJoinKeyArr=entrydivStkJoin.getKey().toString().split(“,”);
for(条目meta:metaData.entrySet())
{
字符串[]metaArr=meta.getKey().split(“,”);
if(metaArr[0].equals(entrydivStkJoinKeyArr[1]))
{
divStkMetaJoin.put(entrydivStkJoin.toString(),meta.getValue());
}
}
}
}   
公共无效清除(上下文上下文上下文)引发IOException、InterruptedException
{
串键;
弦谷;
对于(Map.Entry:divStkMetaJoin.entrySet())
{
keyJ=entry.getKey();
valJ=entry.getValue();
文本k=新文本(键j);
文本v=新文本(valJ);
上下文。写(k,v);
}
}

}

我认为错误来自这一行:

if(键线[4]。等于(“\s”)

如果keyLine为null或keyLine<4:

 if(ss == null || ss.length()<4){
     return;
 }

if(ss==null | | ss.length()哪个语句生成的索引超出了范围?它在reduce方法中。看起来
keyLine
并不总是有5个元素。您可以自己打印并调试它。如果您怀疑索引的元素可能较少,您需要在访问索引之前检查
keyLine
长度。谢谢BobTheBuilder。所以,也许需要做些什么ng类似于“keyLine.length==5&&keyLine[4]=s(“\s”)”。我会先运行它,但它是一个节点中的Mapreduce作业,需要40分钟,所以我必须确保。