请帮助:
在我的mapper类中,我有实例变量protected transient HashMap<String, Double> _map = null;
我在我的setup(Context context)
方法中初始化了这个变量,_map
也填充了从SequenceFile
读取的数据。
设置emthod:
@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
,到目前为止,我无法弄清楚为什么是这样,并被阻挡在这里。
是否有解决这个问题的方法或变通方法?谢谢!
我的猜测是文件没有被正确加载/找到。顺便说一句,我会使用一个计数器(group="error", name="IOException")来计算在setup()方法中抛出IOException的次数。在计数器报告中很容易看到计数:
context.getCounter("error","IOException").increment(1);
如果您确定没有抛出错误,则在try-catch块之前将错误写入记录器。使用错误的严重性,以便您可以确认您可以找到已记录的错误消息。