我正在实现一个自定义MapReduce(对于学校,所以请不要建议使用Hadoop或现有的解决方案),我遇到的问题是"存储"Map和Reduce阶段之间的中间数据。
我正在考虑使用ConcurrentHashMap, CHM_key == Map's_Key,并作为它的值一个数组列表,包含所有Map's_value与Map's_Key相关联,所以减少可以简单地聚合这些值。
但是,我想不出一种方法可以在不锁定整个集合的情况下自动改变CHM的Arraylist实例。
我理解这个集合实现了一个putifAbsent和一个replace方法;实际上putifAbsent是有用的,因为如果键不存在,我只是放一个新的数组列表,然后完成。
然而…替换数组列表并不是那么简单,因为我必须获取它,添加新值,然后替换它,如果不锁定整个集合,这是无法自动完成的…
如果有人感兴趣我找到了解决方案,实际上是非常简单的在这种情况下;你只需要锁定这个值!
public class MapReduceDictionary extends ConcurrentHashMap<String, ArrayList<Integer>>{
private static final long serialVersionUID = 1L;
public void addValue(String key, int value) throws InterruptedException {
ArrayList<Integer> absentArr = new ArrayList<Integer>();
absentArr.add(value);
if (putIfAbsent(key, absentArr) == null) return;
synchronized (get(key)) {
get(key).add(value);
}
}
}
我调试了这个,似乎工作,但如果你有任何评论,这可能会失败,请告诉我!