public void initialize(CrunchTaskContext ctxt) { if (emitter != null) { // Already initialized return; } fn.setContext(ctxt.getContext()); fn.initialize(); for (RTNode child : children) { child.initialize(ctxt); } if (outputConverter != null) { if (outputName != null) { this.emitter = new MultipleOutputEmitter(outputConverter, ctxt.getMultipleOutputs(), outputName); } else { this.emitter = new OutputEmitter(outputConverter, ctxt.getContext()); } } else if (!children.isEmpty()) { Configuration conf = ctxt.getContext().getConfiguration(); boolean disableDeepCopy = conf.getBoolean(RuntimeParameters.DISABLE_DEEP_COPY, false); this.emitter = new IntermediateEmitter(outputPType, children, conf, disableDeepCopy || fn.disableDeepCopy()); } else { throw new CrunchRuntimeException("Invalid RTNode config: no emitter for: " + nodeName); } }