😀

Hiveのクエリにおける変数展開の方法

2021/06/15に公開

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";

などとすればよいです。

GitHubで編集を提案

Discussion