python hadoop utf-8 mapreduce hadoop-streaming

python - hadoop 2.4.0 que transmite las opciones del analizador genérico usando TAB como separador



utf-8 mapreduce (1)

Es posible que tenga este problema "-D stream.map.output.field.separator =." especifica "." como el separador de campo para las salidas del mapa, y el prefijo hasta el cuarto "." en una línea será la clave y el resto de la línea (excluyendo el cuarto ".") será el valor. Si una línea tiene menos de cuatro "." S, entonces toda la línea será la clave y el valor será un objeto de texto vacío (como el creado por el nuevo texto ("")). Aquí se menciona claramente cómo se usa el separador, y también cuántas de las ocurrencias de separadores deben tenerse en cuenta al identificar la clave y el valor del mapa. También hay campos relacionados con la partición, en función de los cuales se manejará el reductor. Como desea que se cambie el separador, creo que debe verificar esto también relacionado con la partición y el reductor.

Sé que la pestaña es el separador de entrada predeterminado para los campos:

stream.map.output.field.separator stream.reduce.input.field.separator stream.reduce.output.field.separator mapreduce.textoutputformat.separator

pero si intento escribir la opción del analizador genérico:

stream.map.output.field.separator=/t (or) stream.map.output.field.separator="/t"

para probar cómo hadoop analiza caracteres de espacios en blanco como "/ t, / n, / f" cuando se utilizan como separadores. Observé que hadoop lo lee como / t personaje pero no " "espacio de pestañas en sí. Lo comprobé imprimiendo cada línea en el reductor (python) mientras se lee usando:

sys.stdout.write(str(line))

Mi mapeador emite pares de clave / valor como: key value1 value2

usando el comando print (key,value1,value2,sep=''/t'',end=''/n'') .

Así que esperaba que mi reductor leyera cada línea como: valor sys.stdout.write(str(line)) también, pero en sys.stdout.write(str(line)) lugar sys.stdout.write(str(line)) impreso:

key value1 value2 //with trailing space

Desde la transmisión de Hadoop: elimine la pestaña final de la salida del reductor , entendí que el espacio final se debe a que mapreduce.textoutputformat.separator no se configuró y se dejó como predeterminado.

Entonces, esto confirmó mi suposición de que hadoop consideró mi producción total de mapas:

key value1 value2

como clave y valor como objeto de texto vacío ya que lee el separador de stream.map.output.field.separator=/t como "/ t" carácter en lugar de " "espacio de tabulación en sí".

Por favor, ayúdame a entender este comportamiento y cómo puedo usar / t como separador si quiero.