web-dev-qa-db-ja.com

Hiveスクリプトで複数のパラメーターを渡す方法

従業員: テーブルデータ

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 @ [])が発生します。

3
Riyaz Khan

新しい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文字列を指定する必要がある場合があることに注意してください。

0
Piyush Patel

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行

0
Riyaz Khan

変数の受け渡しは、「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
0
RPaul