这是我的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(..)
有什么问题?
更新:
感谢@paxdiablo为您的详细解答。
在将输入数据传输到我的自定义bin
之前,我真正想要做的是过滤掉第一列大于x
的一些数据。所以-mapper
实际上看起来像这样:
-mapper "awk -v x=$x{if($0<x)print} | ./bin"
有没有其他方法可以实现这一目标?
顺便提一下,Alcott'$ 0'是整个输入行。如果你只想要第一个字段,那就是$ 1。 – paxdiablo