Это моя Hadoop работа:AWK не работает в картографа Hadoop в
hadoop streaming \
-D mapred.map.tasks=1\
-D mapred.reduce.tasks=1\
-mapper "awk '{if(\$0<3)print}'" \ # doesn't work
-reducer "cat" \
-input "/user/***/input/" \
-output "/user/***/out/"
эта работа всегда терпит неудачу с ошибкой, говоря:
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `export TMPDIR='..../work/tmp'; /bin/awk { if ($0 < 3) print } '
Но если изменить -mapper
в этом: -mapper "awk '{print}'" работает без ошибок. В чем проблема с if(..)
?
UPDATE:
Спасибо @paxdiablo за подробный ответ.
то, что я действительно хочу сделать, это отфильтровать некоторые данные, чей 1-й столбец больше x
, перед тем, как направить входные данные в мой пользовательский bin
. Так что на самом деле -mapper
выглядит следующим образом:
-mapper "awk -v x=$x{if($0<x)print} | ./bin"
Есть ли другой способ достичь этого?
Кстати, Alcott, '$ 0' - вся строка ввода. Если вы хотите только первое поле, это '$ 1'. – paxdiablo