Hiveでのプレースホルダ置換

Hiveのテーブルで日付毎にパーティションを作るってよくやりますよね。

でもってこんな感じのクエリなげたりしますよね。

select count(distinct user_id) from daily_log where yyyymmdd='20131201'

で、もし1ヶ月分の日ごとのUUが欲しいとか言われたら

select count(distinct user_id) from daily_log where yyyymmdd='<<YYYYMMDD>>'

という感じのテンプレートuu.templateを用意して、
下記のようなシェルを実行しますよね。てか僕はしてました。要はsedで置換してファイルつくってそれを実行みたいな感じです。

seq -f 2013%g 1201 1231 | while read yyyymmdd
do
        echo ${yyyymmdd}
        sed -e "s/<<YYYYMMDD>>/${yyyymmdd}/" uu.template > uu_${yyyymmdd}.hql
        hive -f uu_${yyyymmdd}.hql
        if [ $? -ne 0 ]; then
                echo "hive error"
                exit 1
        fi
done

でも、こんな感じのテンプレートを用意して

select count(distinct user_id) from daily_log where yyyymmdd='${yyyymmdd}'

下記のようにやる方法もあるんですね。これならsedで置換してファイル作る必要無いのでその分楽ですね。

seq -f 2013%g 1201 1231 | while read yyyymmdd
do
        echo ${yyyymmdd}
        hive -d yyyymmdd=${yyyymmdd} -f uu.template
        if [ $? -ne 0 ]; then
                echo "hive error"
                exit 1
        fi
done

以上、小ネタでした。