2015-05-27 12 views
5

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ę.

Odpowiedz

0

Być może problem dotyczy: "-D stream.map.output.field.separator =." określa "." jako separator pól dla wyjść map oraz przedrostek do czwartego "." w linii będzie kluczem, a reszta linii (z wyłączeniem czwartego ".") będzie wartością. Jeśli linia ma mniej niż cztery "." S, wówczas cała linia będzie kluczem, a wartość będzie pustym obiektem Tekstowym (takim jak ten utworzony przez nowy Tekst ("")).Here jest wyraźnie wspomniane, w jaki sposób używany jest separator, a także ile takich wystąpień separatora należy wziąć pod uwagę przy identyfikacji klucza i wartości mapy. Istnieją również pola związane z partycjonowaniem, na podstawie których będzie obsługiwany reduktor. Jak chcesz, aby separator został zmieniony, myślę, że musisz to zweryfikować, również w odniesieniu do partycjonowania i reduktora.

+0

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

+0

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

+0

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

Powiązane problemy