这是我的 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(..)
?
更新:
感谢@paxdiablo 的详细回答。
我真正想做的是过滤掉第一列大于的一些数据x
,然后将输入数据传递给我的自定义bin
。所以-mapper
实际上看起来像这样:
-mapper "awk -v x=$x{if($0<x)print} | ./bin"
还有其他方法可以实现吗?