使用Java减少边连接ArrayIndexOutOfBounds异常
正在尝试在3个数据集上运行Reduce-Side连接。不幸的是,我一直收到ArrayIndex异常。我试着用try&Catch来处理它,但没有用。有人能推荐一个解决方案吗使用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
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分钟,所以我必须确保。