请帮助:
在我的mapper类中,我有实例变量protected transient HashMap<String, Double> _map = null;
我在setup(Context context)
方法中初始化了此变量,同时_map
填充了从SequenceFile
读入的数据。
设置方法:
@Override
protected void setup(Context context) throws IOException, InterruptedException
{
super.setup(context);
Configuration conf = context.getConfiguration();
_map = new HashMap<String, Double>();
Path seqFilePath = new Path(conf.get("in"));
Reader reader;
try
{
reader = new Reader(conf, Reader.file(seqFilePath));
Text key = new Text();
DoubleWritable value = new DoubleWritable();
while (reader.next(key, value))
{
_map.put(key.toString().trim(), value.get());
}
}
catch (IOException e)
{
LOGGER.error("Can't find the input path to read: " + seqFilePath, e);
}
}
map()
方法:
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
...
getDiscretizationLabel(...);
...
}
在我的getDiscretizationLabel(...)
方法中,我尝试从_map
变量中检索数据,但NullPointerException
正在抛出:
private void getDiscretizationLabel(String attribute, String value, String category, int bin, Context context) throws IOException, InterruptedException
{
...
min = _map.get(attribute + "_min"); // throws NullPointerException
max = _map.get(attribute + "_max");
...
}
getDiscretizationLabel(...)
抛出NullPointerException
,到目前为止,我无法弄清楚为什么会这样,并在此处被屏蔽。
有没有办法解决这个问题或解决方法?谢谢!
答案 0 :(得分:2)
我的猜测是文件未正确加载/找到。顺便说一句,我会使用一个计数器(group =“error”,name =“IOException”)来计算在setup()方法中抛出IOException的次数。在柜台报告中很容易看到计数:
context.getCounter("error","IOException").increment(1);
如果您确定没有抛出错误,请在try-catch块之前向记录器写入错误。使用严重性错误,以便确认您可以找到记录的错误消息。