這是我的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