2015-05-27 8 views
5

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.

risposta

0

Si potrebbe avere questo problema "-D stream.map.output.field.separator =." specifica "." come separatore di campo per le uscite della mappa, e il prefisso fino al quarto "." in una linea sarà la chiave e il resto della linea (escluso il quarto ".") sarà il valore. Se una linea ha meno di quattro "." S, l'intera riga sarà la chiave e il valore sarà un oggetto Testo vuoto (come quello creato dal nuovo Testo ("")).Here viene chiaramente menzionato il modo in cui viene utilizzato il separatore e anche il numero di tali occorrenze di separatori da considerare quando si identifica la chiave e il valore della mappa. Inoltre ci sono campi relativi al partizionamento, in base ai quali verrà gestito il riduttore. Come vuoi che il separatore venga modificato, penso che devi verificare anche questo relativo al partizionamento e al riduttore.

+0

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

+0

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

+0

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

Problemi correlati