通过java编写的hadoop程序与通过hadoop-streaming(c++)在reduce阶段的区别:
对于前者,由map阶段输出的<k,v>会将相同的k哈希到结构<k,list v>,并用一个reduce处理。因此在reduce中,得理完这个<k,list v>就可以输出。
对于后者,map输出也是<k,v>结构,同样也会将相同的k哈希到一起,但是,不是<k,list v>结构,而仍然是<k,v>结构,相同的k会在一起,因此,reduce阶段读入的一条记录仍然是<k,v>,在处理完成相同的记录之后,输出到标准输出即可。
也常这样做,在reduce中,定义一个全局的类,用map来保留统计结果,在while循环读取记录的时候,改写这个map。通常还会设定一个计数器,当读取记录大于20w,且当前读取的记录不等于前一条,则可以说明当前记录和前一条记录属于不同的组,就可以输出了。