在我的映射器中,我需要弄清楚记录是否是给予此映射器的最后一条记录。有没有办法做到这一点?也就是说,让我们说一个映射器被给予1000条记录。映射器逐个处理它们。如何确定映射器何时处理最后一条记录?
答案 0 :(得分:2)
在map()
方法内部无法实现,但您可以保存所有输入记录并使用cleanup()
方法进行处理。
这样的事情:
public static class LastRecordMapper
extends Mapper<LongWritable, Text, Text, IntWritable>{
private List<Map.Entry<Long, String>> data = new ArrayList<Map.Entry<Long, String>>();
@Override
public void map(LongWritable key, Text value, Context context) {
data.add(new AbstractMap.SimpleEntry<Long, String>(key.get(), value.toString()));
}
@Override
protected void cleanup(Context context) throws IndexOutOfBoundsException {
Map.Entry<Long, String> lastRecord = data.get(data.size() - 1);
/* ... Proceed last record ... */
}
}
但是在RAM中保留所有输入记录时要小心,因为如果没有足够的堆大小,它可能会导致OutOfMemoryException。
如果您只需要上一个输入记录的键和值,那么您只能保存这个:
private Map.Entry<Long, String> lastRecord = null;
@Override
public void map(LongWritable key, Text value, Context context) {
lastRecord = new AbstractMap.SimpleEntry<Long, String>(key.get(), value.toString());
}