#NEWLINE# def description( self , step_num ) : #NEWLINE# #INDENT# "Returns a dictionary representation of this step:\n\n        .. code-block:: js\n\n            {\n                'type': 'streaming',\n                'mapper': { ... },\n                'combiner': { ... },\n                'reducer': { ... },\n                'jobconf': dictionary of Hadoop configuration properties\n            }\n\n        ``jobconf`` is optional, and only one of ``mapper``, ``combiner``,\n        and ``reducer`` need be included.\n\n        ``mapper``, ``combiner``, and ``reducer`` are either handled by\n        the script containing your job definition:\n\n        .. code-block:: js\n\n           {\n               'type': 'script',\n               'pre_filter': (optional) cmd to pass input through, as a string\n           }\n\n        or they simply run a command:\n\n        .. code-block:: js\n\n            {\n                'type': 'command',\n                'command': command to run, as a string\n            }\n\n        See :ref:`steps-format` for examples.\n        " #NEWLINE# substep_descs = { #NEWLINE# #INDENT# 'type' : 'streaming' , #NEWLINE# #UNINDENT# } #NEWLINE# if ( ( step_num == 0 ) or self . has_explicit_mapper or self . has_explicit_combiner ) : #NEWLINE# #INDENT# substep_descs [ 'mapper' ] = self . render_mapper ( ) #NEWLINE# #UNINDENT# if self . has_explicit_combiner : #NEWLINE# #INDENT# substep_descs [ 'combiner' ] = self . render_combiner ( ) #NEWLINE# #UNINDENT# if self . has_explicit_reducer : #NEWLINE# #INDENT# substep_descs [ 'reducer' ] = self . render_reducer ( ) #NEWLINE# #UNINDENT# if self . _steps [ 'jobconf' ] : #NEWLINE# #INDENT# substep_descs [ 'jobconf' ] = self . _steps [ 'jobconf' ] #NEWLINE# #UNINDENT# return substep_descs