【Hive】Hive / HiveQL ~ Hiveの変数 ~

■ はじめに

hive の変数 hiveconf について扱ったのでまとめておく。

目次

【0】公式ドキュメント
【1】Hiveの変数の種類
 1)hivevar
 2)hiveconf
 3)env
 4)system
【2】指定の仕方
 1)コマンドラインからの指定
 2)ファイル内での指定
【3】デバッグ出力について
【4】変数置換機能ON/OFF - hive.variable.substitute
【5】「コマンドラインからの指定」する場合の注意点
 1)値に空白がある場合
 2)複数指定したい場合

【0】公式ドキュメント

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution

【1】Hiveの変数の種類

以下の4通り。

1)hivevar
2)hiveconf
3)env
4)system

1)hivevar

* namespaceが不要で${変数}のみで変数展開できる

サンプル

set hivevar:target_date=2020-03-01;

SELECT * FROM person_table WHERE birth_date="${hivevar:target_date}"

-- hivevar:なくても大丈夫
SELECT * FROM person_table WHERE birth_date="${target_date}"

2)hiveconf

* 指定する場合、『${hiveconf:【変数名】}』とする。

サンプル

set hiveconf:target_date=2020-03-01;

-- ${hiveconf:target_date} で指定
SELECT * FROM person_table WHERE birth_date="${hiveconf:target_date}"

3)env

* 環境変数
* Hive実行前に設定しておく必要がある

サンプル

SELECT * FROM person WHERE name="${env:var_name}"

4)system

* jvm(Java Virtual Machine)

サンプル

hive> select '${system:user.name}';

OK
hadoop_user

【2】指定の仕方

* 変数の設定の仕方は、以下の2通りある。

1)コマンドラインからの指定
2)ファイル内での指定

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution#LanguageManualVariableSubstitution-UsingVariables

1)コマンドラインからの指定

構文

# -f <filename> : ファイルからのSQL実行
# -v : 詳細モード(実行したSQLをコンソール上に表示)
hive --hivevar 【変数】=【値】 -v -f 【ファイル名】

2)ファイル内での指定

構文

set hivevar:【変数】=【値】;

【3】デバッグ出力について

https://dk521123.hatenablog.com/entry/2020/07/29/141607

より抜粋
~~~~~~
!echo "hello world. ${value1}"; 
~~~~~~

【4】変数置換機能ON/OFF - hive.variable.substitute

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution#LanguageManualVariableSubstitution-DisablingVariableSubstitution

より、変数により置換機能をOffにしたい場合、
「hive.variable.substitute=false」にすればいいらしい。
(あんまり必要なさそうだけど)

サンプル

# デフォルトは true
set hive.variable.substitute=false;

【5】「コマンドラインからの指定」する場合の注意点

1)値に空白がある場合

# 囲み文字が指定できないので、空白はどうするんだってなると思うが...
* 「バックスラッシュでエスケープする」又は「囲み文字(" or ')で囲う」

サンプル

# ${hiveconf:target_datetime}=2021/06/24\ 10:10:10
hive -v -f sample.hql --hiveconf target_datetime=2021/06/24\ 10:10:10

hive -v -f sample.hql --hiveconf target_datetime="2021/06/24 10:10:10"

2)複数指定したい場合

* 1変数につき、「--hiveconf」(or 「--hivevar」)を指定する。

サンプル

hive -v -f sample.hql --hiveconf value1=hello --hiveconf value2=world

sample.hql(上記サンプルで実験用に使用)

!echo "target_datetime : ${hiveconf:target_datetime}"; 
!echo "value1 : ${hiveconf:value1}"; 
!echo "value2 : ${hiveconf:value2}"; 

参考文献

http://nosource.blog35.fc2.com/blog-entry-168.html
https://qiita.com/wwacky/items/358fb9145db3143220f6
https://gist.github.com/ksomemo/bad7a25bdd428f86ef1b

関連記事

Hive / HiveQL ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2019/11/25/235219
Hive / HiveQL ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/25/231235
Hive / HiveQL ~ デバッグ編 ~
https://dk521123.hatenablog.com/entry/2020/07/29/141607