So che la scheda è separatore di input predefinito per i campi:Hadoop 2.4.0 in streaming opzioni parser generico utilizzando TAB come separatore
stream.map.output.field.separator
stream.reduce.input.field.separator
stream.reduce.output.field.separator
mapreduce.textoutputformat.separator
ma se provo a scrivere l'opzione parser generico:
stream.map.output.field.separator=\t (or)
stream.map.output.field.separator="\t"
per verificare come hadoop analizza i caratteri dello spazio bianco come "\ t, \ n, \ f" quando usati come separatori. Ho osservato che hadoop lo legge come carattere \ t ma non "tablatura" "stesso. Ho controllato stampando ogni riga in riduttore (Python) come si legge utilizzando:
sys.stdout.write(str(line))
mio mapper emette coppie chiave/valore come: key value1 value2
usando print (key,value1,value2,sep='\t',end='\n')
comando.
così mi aspettavo il mio riduttore di leggere ogni riga come: key value1 value2
troppo, ma invece sys.stdout.write(str(line))
stampato:
key value1 value2 \\with trailing space
Da Hadoop streaming - remove trailing tab from reducer output, ho capito che lo spazio finale è dovuto alla mapreduce.textoutputformat.separator
non essere impostato e sinistra come predefinito.
Quindi, questo ha confermato la mia ipotesi che Hadoop considerato la mia mappa di uscita totale:
key value1 value2
come chiave e valore come oggetto di testo vuoto dal momento che leggere il separatore da stream.map.output.field.separator=\t
come "\ t" carattere invece di "Tab +" "stesso.
Per favore aiutami a capire questo comportamento e come posso usare \ t come separatore se voglio.
Non sto dando alcun numero di campo nel mio argomento e AFAI ha capito, il problema che hai citato sorge solo se fornisco un numero di campo e se fornisco un numero di campo inferiore al mio previsto. Non ho capito la parte relativa ai "campi relativi al partizionamento". Comunque stavo eseguendo il debug del codice sorgente Hadoop 2.4.0, interessante, in "PipeMapper.java": la riga 'mapOutputFieldSeparator = job.get (" stream.map.output.field.separator "," \ t "). GetBytes ("UTF-8"); 'restituisce' t' omettendo \ carattere quando fornisco 'stream.map.output.field.separator = \ t' come argomento e' TAB' (caratteri bianchi) senza argomento. – annunarcist
Prova ad aggiungere il parametro "stream.map.output.field.separator" valore di "\ t", nel tuo codice java di lavoro. Non sono sicuro del motivo per cui si è verificato un problema durante il prelievo da altro dove – Ramzy
Questo è un processo di streaming. Possiamo solo passare mapper/riduttori come script/eseguibili e sto usando gli script Python per il mio mappatore e riduttore.Non possiamo accedere all'oggetto lavoro qui. – annunarcist