😀
Hiveのクエリにおける変数展開の方法
Hiveのクエリを一部の条件だけ書き換えて使い回したい場合、その条件を変数にしておくと便利です。
今回は変数の書き方と展開方法について書きたいと思います。
クエリの準備
クエリ内に変数を記述するときは${変数名}
とします。
例として、今回はmembers
テーブルから指定した範囲の年齢のメンバーだけを抽出するようなクエリを作成します。
そこで、年齢の最小値を${min_age}
、最大値を${max_age}
とした以下のクエリをquery.hql
として保存しておきます。
select
*
from
members
where
age between ${min_age} and ${max_age}
変数の展開方法
クエリ実行時に変数を展開する方法を2種類紹介します。
コマンドラインで指定
hive
コマンドに--hivevar 変数名=値
を展開する変数の数だけ与えます。
# 20代のみ抽出
$ hive --hivevar min_age=20 --hivevar max_age=29 -f query.hql
これを以下のようにしてしまうと動かないので注意してください。
# 20代のみ抽出(動かない)
$ hive --hivevar min_age=20 max_age=29 -f query.hql
別ファイルで指定
set hivevar:変数名=値;
と記述したファイルを用意しておく。コマンドラインから指定したときと同様の条件の場合は、
set hivevar:min_age=20;
set hivevar:max_age=29;
と記述します(セミコロンを忘れるとエラーが出るため注意)。ここではこれをhivevar.hql
として保存しておきます。
クエリを実行する際にはhive
コマンドに-i 変数を記述したファイルのパス
を与えると変数が展開できます(このとき、.hiverc
は読み込まれないため注意)。
$ hive -i hivevar.hql -f query.hql
ちなみに、SET hivevar:変数名=値;
はクエリの先頭に直接記述しても動作します。
その場合は変数を記述したファイルの指定は不要なので、
$ hive -f query.hql
とするだけでよいです。
他にも、いくつかの値の中から、どれかにあてはまればよい場合にもこの方法が利用してその候補を変数として扱うことができます。
たとえば、A, B, Cのクラスに該当するメンバーを抽出したい場合は、
-- query.hql
select
*
from
members
where
category in (${class})
-- hivevar.hql
set hivevar:class="A","B","C";
などとすればよいです。
Discussion