Iterate twice on values (MapReduce)

前端 未结 11 1086
轮回少年
轮回少年 2020-11-29 07:22

I receive an iterator as argument and I would like to iterate on values twice.

public void reduce(Pair key, Iterator          


        
11条回答
  •  死守一世寂寞
    2020-11-29 08:21

    If we are trying to iterate twice in Reducer as below

    ListIterator lit = IteratorUtils.toListIterator(it);
    System.out.println("Using ListIterator 1st pass");
    while(lit.hasNext())
        System.out.println(lit.next());
    
    // move the list iterator back to start
    while(lit.hasPrevious())
        lit.previous();
    
    System.out.println("Using ListIterator 2nd pass");
    while(lit.hasNext())
        System.out.println(lit.next());
    

    We will only output as

    Using ListIterator 1st pass
    5.3
    4.9
    5.3
    4.6
    4.6
    Using ListIterator 2nd pass
    5.3
    5.3
    5.3
    5.3
    5.3
    

    Inorder to get it in the right way we should loop like this:

    ArrayList cache = new ArrayList();
     for (DoubleWritable aNum : values) {
        System.out.println("first iteration: " + aNum);
        DoubleWritable writable = new DoubleWritable();
        writable.set(aNum.get());
        cache.add(writable);
     }
     int size = cache.size();
     for (int i = 0; i < size; ++i) {
         System.out.println("second iteration: " + cache.get(i));
      }
    

    Output

    first iteration: 5.3
    first iteration: 4.9
    first iteration: 5.3
    first iteration: 4.6
    first iteration: 4.6
    second iteration: 5.3
    second iteration: 4.9
    second iteration: 5.3
    second iteration: 4.6
    second iteration: 4.6
    

提交回复
热议问题