wiem, że karta jest domyślny separator wejściowy dla pól:Hadoop 2.4.0 Opcje ogólne strumieniowych parsera przy użyciu karty jako separatora
stream.map.output.field.separator
stream.reduce.input.field.separator
stream.reduce.output.field.separator
mapreduce.textoutputformat.separator
ale gdy próbuję napisać rodzajowego opcję parsera:
stream.map.output.field.separator=\t (or)
stream.map.output.field.separator="\t"
, aby przetestować, w jaki sposób mysop analizuje białe spacje, takie jak "\ t, \ n, \ f", gdy są używane jako separatory. Zauważyłem, że hadoop czyta go jako znak \ t, ale nie "". Sprawdziłem go drukując każdą linię w reduktor (Python), jak to brzmi, używając:
sys.stdout.write(str(line))
Moja odwzorowujący emituje pary klucz/wartość jako: key value1 value2
pomocą polecenia print (key,value1,value2,sep='\t',end='\n')
.
więc spodziewałem mój reduktor czytać każdą linię jako: key value1 value2
też, ale zamiast sys.stdout.write(str(line))
drukowane:
key value1 value2 \\with trailing space
Od Hadoop streaming - remove trailing tab from reducer output, zrozumiałem, że przestrzeń spływu jest wynikiem nie mapreduce.textoutputformat.separator
ustawiany i lewo jako domyślny.
Tak, ten potwierdził moje założenie, że Hadoop rozważył moją całkowita moc mapy:
key value1 value2
jako klucz i wartość jako pustego obiektu Text ponieważ odczytać separatora z stream.map.output.field.separator=\t
jako „\ t” charakteru zamiast "" sama przestrzeń tabulatora.
Proszę mi pomóc zrozumieć to zachowanie i jak mogę użyć \ t jako separatora, jeśli chcę.
Nie podaję żadnego numeru pola w mojej argumentacji i AFAI rozumie, problem, o którym wspomniałeś, powstaje tylko wtedy, gdy podam numer pola i podam mniej niż mój numer pola. Nie rozumiałem części dotyczącej "pól związanych z partycjonowaniem". Jednak debugowałem kod źródłowy Hadoop 2.4.0, co ciekawe, w "PipeMapper.java": linia 'mapOutputFieldSeparator = job.get (" stream.map.output.field.separator "," \ t "). GetBytes ("UTF-8"); 'wyprowadza' t' pomijając \ znak, gdy podaję argument 'stream.map.output.field.separator = \ t' jako argument i' TAB' (białe znaki), gdy nie ma argumentu. – annunarcist
Spróbuj dodać parametr "stream.map.output.field.separator" o wartości "\ t", w twoim kodzie java zadania. Nie wiesz, dlaczego ma problem z odbiorem z innego miejsca. – Ramzy
To jest przesyłanie strumieniowe. Możemy przekazać mappers/reducers tylko jako skrypty/pliki wykonywalne i używam skryptów Pythona dla mojego programu odwzorowującego i reduktora.Nie możemy uzyskać dostępu do obiektu zadania tutaj. – annunarcist