@Override public <E> void processRow(Object key, Iterator<E> values) throws IOException { if (reducer.getDone()) { return; } try { BytesWritable keyWritable = (BytesWritable) key; byte tag = 0; if (isTagged) { // remove the tag from key coming out of reducer // and store it in separate variable. int size = keyWritable.getSize() - 1; tag = keyWritable.get()[size]; keyWritable.setSize(size); } if (!keyWritable.equals(groupKey)) { // If a operator wants to do some work at the beginning of a group if (groupKey == null) { // the first group groupKey = new BytesWritable(); } else { // If a operator wants to do some work at the end of a group LOG.trace("End Group"); reducer.endGroup(); } try { keyObject = inputKeyDeserializer.deserialize(keyWritable); } catch (Exception e) { throw new HiveException( "Hive Runtime Error: Unable to deserialize reduce input key from " + Utilities.formatBinaryString(keyWritable.get(), 0, keyWritable.getSize()) + " with properties " + keyTableDesc.getProperties(), e); } groupKey.set(keyWritable.get(), 0, keyWritable.getSize()); LOG.trace("Start Group"); reducer.setGroupKeyObject(keyObject); reducer.startGroup(); } /* this.keyObject passed via reference */ if (vectorized) { processVectors(values, tag); } else { processKeyValues(values, tag); } } catch (Throwable e) { abort = true; Utilities.setReduceWork(jc, null); if (e instanceof OutOfMemoryError) { // Don't create a new object if we are already out of memory throw (OutOfMemoryError) e; } else { String msg = "Fatal error: " + e; LOG.fatal(msg, e); throw new RuntimeException(e); } } }