在我的映射器中,我需要弄清楚一条记录是否是给这个映射器的最后一条记录。有办法做到这一点吗?也就是说,假设一个映射器有1000条记录。映射器一个接一个地处理它们。如何计算映射器何时处理最后一条记录?
在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());
}