従業員: テーブルデータ
Hiveスクリプトsample.hqlを実行して、year = 2016のレコードをフェッチしたい。
use octdb;
select * from '${hiveconf:table}' where year = '${hiveconf:year}';
[cloudera@quickstart ~]$ Hive -hiveconf table='employee', year=2016 -f sample.hql
しかし、エラーNoViableAltException(307 @ [])が発生します。
新しいHiveバージョンでは、代わりに--hivevar
を使用する必要があります。以前は、開発者は--hiveconf
を使用して構成を設定することができ、変数にも使用されていました。ただし、後で--hivevar
が実装され、 Hive-202 で説明されているように、変数に個別の名前空間が設定されました。
ビーラインで以下を使用
beeline --hivevar table=employee --hivevar year=2016 -f sample.hql
これにより、Hiveスクリプトファイルで、この変数に直接アクセスしたり、以下のようなhivevar名前空間を使用したりできます。
select * from ${table};
select * from ${hivevar:table};
-u <db_URL>
オプションを使用してURL文字列を指定する必要がある場合があることに注意してください。
R&Dが正しい答えを見つけたことにより、$ {hiveconf:table}は ''なしでスクリプトで定義する必要があります。 sample.hql:-
use ${hiveconf:database};
select * from ${hiveconf:table} where year = ${hiveconf:year};
Sample.hqlを実行する
[cloudera@quickstart Shell]$ Hive -hiveconf database=octdb -hiveconf table=employee -hiveconf year=2016 -f sample.hql
ファイルの構成を使用して初期化されたロギング:/etc/Hive/conf.dist/Hive-log4j.properties OK
Time taken: 1.484 seconds
OK
1 A 2016
2 B 2016
4 D 2016
所要時間:4.423秒、フェッチ:3行
変数の受け渡しは、「hivevar」と「hiveconf」を使用して行うこともできます。
ここに違いがあります:
Hiveconf名前空間が追加され、Hive構成値を設定するには(-hiveconf)を使用する必要があります。
Hivevar名前空間が追加され、ユーザー変数を定義するには(-hivevar)を使用する必要があります。
Hiveconfの使用も機能しますが、hivevarはその目的のために明示的に作成されるため、変数の置換にはお勧めできません。
set hivevar:YEAR=2018;
SELECT * from table where year=${YEAR};
Hive --hiveconf var='hello world' -e '!echo ${hiveconf:var};'
-- this will print: hello world