In essence, they have implemented their Group function as a real simple Map/Reduce job, in which the "Map" phase is skipped partially Instead of completely decoupling the Map and Reduce phase, a Reduce is performed right after each object is Mapped: you perform a Reduce directly on the source object. Regular Map/Reduce frameworks usually decouple the Map and Reduce phase completely: you perform a Map on the source object, and a Reduce on all the emitted Map objects. This of course brings a lot of overhead (lots of Map objects emitted with just the value "1").