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 を実行する手間を考えると重宝しそうです。