Pigで構文エラーの出ている箇所の行番号が知りたいっ!
Pig の文法的なデバッグには run とか describe とかがめちゃくちゃ便利ですが、そもそもエラーの箇所を教えてくれない言語ってどうなんですかね!!
ということで簡易的なスクリプトを作りました。
check_pig_error.sh
#!/bin/bash
usage() {
cat <<USAGE
usage: $(basename $0) [-p <param_name>=param_value] [-m <file_name>] [-x exectype] <script>
Execute the script with access to grunt environment.
-p <param_name - See parameter substitution for details.
-m <file_name> - See parameter substitution for details.
-x <exectype> - Set execution mode: local|mapreduce, default is mapreduce.
script - Script to be executed.
USAGE
exit 1
}
while getopts p:m:x: OPT; do
case $OPT in
p) param="$param -param $OPTARG";;
m) param_file="$param_file -param_file $OPTARG";;
x) exectype="-x $OPTARG";;
esac
done
shift $(($OPTIND - 1))
[ $# -eq 1 ] || usage
script=$1
tmpfile=$(mktemp /tmp/$(basename $script).XXXXXXXXXX)
# remove characters except ASCII characters
perl -nle 's/[^\x00-\x7F]//g; print' $script >$tmpfile
line_num=$(echo run $param $param_file $tmpfile | pig $exectype | wc -l)
echo at line $(($line_num - 1)) 1>&2
rm $tmpfile
例えば次のようなPigに対して
sample.pig
-- デバッグのサンプルだよ!
A = LOAD 'hoge' AS (
key :int, -- キーだよ!
value :int -- バリューだよ!!
);
B = GROUP A BY key;
C = FOREACH B GENERATE group, COUNT(B);
STORE C INTO 'fuga';
Pigを実行すると
$ pig -x local sample.pig
2011-10-04 03:58:40,674 [main] INFO org.apache.pig.Main - Logging error messages to: /Users/arabiki/work/pig/pig_1317668320673.log
2011-10-04 03:58:40,796 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file:///
2011-10-04 03:58:41,029 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: Error during parsing. Scalars can be only used with projections
Details at logfile: /Users/arabiki/work/pig/pig_1317668320673.log
とかいうわけのわからないメッセージが表示されます。(慣れないとホント意味不明です)
そこで check_pig_error.sh を通すと
$ bash check_pig_error.sh -x local sample.pig
2011-10-04 03:59:23,592 [main] INFO org.apache.pig.Main - Logging error messages to: /Users/arabiki/work/pig/pig_1317668363590.log
2011-10-04 03:59:23,799 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: file:///
2011-10-04 03:59:24,052 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: Error during parsing. Scalars can be only used with projections
Details at logfile: /Users/arabiki/work/pig/pig_1317668363590.log
at line 9
ってな感じで最後にエラーで落ちた行番号が表示されます。
環境(バージョン?)によってはたとえコメントであっても日本語が含まれていると run を実行しても正しくパースしてくれないんで、いちいちコメントの日本語を削除して run を実行する手間を考えると重宝しそうです。