web-dev-qa-db-ja.com

Hiveスクリプトで変数を設定する方法

Hive QLでSET varname = valueに相当するSQLを探しています

私は次のようなことができることを知っています:

SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE

しかし、私はこのエラーを受け取ります:

ここでは文字「@」はサポートされていません

87
user1678312

変数の置換には、特別なhiveconfを使用する必要があります。例えば.

Hive> set CURRENT_DATE='2012-09-16';
Hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'

同様に、コマンドラインで渡すことができます:

% Hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql

envおよびsystem変数もあることに注意してください。したがって、たとえば${env:USER}を参照できます。

使用可能なすべての変数を表示するには、コマンドラインから次を実行します。

% Hive -e 'set;'

またはHiveプロンプトから、実行します

Hive> set;

更新:私もhivevar変数の使用を開始し、Hive CLIから含めることができるhqlスニペットに入れますsourceコマンド(またはコマンドラインから-iオプションとして渡す)。ここでの利点は、変数をhivevarプレフィックスの有無に関係なく使用できることであり、グローバルな使用とローカルな使用に類似したものを許可します。

したがって、テーブル名変数を設定するいくつかのsetup.hqlがあると仮定します。

set hivevar:tablename=mytable;

その後、Hiveに取り込むことができます。

Hive> source /path/to/setup.hql;

クエリで使用:

Hive> select * from ${tablename}

または

Hive> select * from ${hivevar:tablename}

「ローカル」テーブル名を設定することもできます。これは、$ {tablename}の使用に影響しますが、$ {hivevar:tablename}には影響しません。

Hive> set tablename=newtable;
Hive> select * from ${tablename} -- uses 'newtable'

Hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'

おそらくCLIからあまり意味がありませんが、sourceを使用するファイルにhqlを含めることができますが、変数の一部を「ローカル」に設定できますスクリプトの残りの部分で使用します。

182
libjack

ここでの回答のほとんどは、hiveconfまたはhivevar名前空間を使用して変数を保存することを示唆しています。そして、それらの答えはすべて正しいです。ただし、もう1つの名前空間があります。

変数を保持するために合計3つのnamespacesが利用可能です。

  1. hiveconf-これでHiveが開始され、すべてのHive構成がこのconfの一部として保存されます。最初は、変数置換はHiveの一部ではなく、導入されたとき、すべてのユーザー定義変数もこれの一部として保存されていました。これは間違いなく良い考えではありません。そのため、さらに2つの名前空間が作成されました。
  2. hivevar:ユーザー変数を保存するには
  3. システム:システム変数を保存します。

したがって、クエリの一部として変数(つまり、dateまたはproduct_number)を保存する場合は、hivevar名前空間ではなく、hiveconf名前空間を使用する必要があります。

そして、これがどのように機能するかです。

hiveconfデフォルトの名前空間のままなので、名前空間を指定しない場合、変数はhiveconf名前空間に保存されます。

ただし、変数の参照に関しては、そうではありません。デフォルトでは、hivevar名前空間を参照します。わかりにくいですよね?次の例でより明確になります。

名前空間を提供しないを実行すると、変数varhiveconf名前空間に格納されます。

set var="default_namespace";

したがって、これにアクセスするには指定する必要がありますhiveconf名前空間

select ${hiveconf:var};

名前空間を提供しないの場合、以下に示すようにエラーが発生します。変数にアクセスしようとすると、デフォルトでhivevar名前空間のみでチェックするためです。また、hivevarにはvarという名前の変数はありません

select ${var}; 

hivevar名前空間を明示的に提供しました

set hivevar:var="hivevar_namespace";

名前空間を提供しているため、これは機能します。

select ${hivevar:var}; 

また、デフォルトとして、変数の参照中に使用されるワークスペースはhivevarであり、以下も機能します。

select ${var};
9
Gaurang Shah

ドル記号および括弧を次のように使用してみましたか?

SELECT * 
FROM foo 
WHERE day >= '${CURRENT_DATE}';
6
YABADABADOU

2つの簡単な方法:

Hive confの使用

Hive> set USER_NAME='FOO';
Hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';

Hive varsの使用

CLIで変数を設定し、Hiveで使用します

set hivevar:USER_NAME='FOO';

Hive> select * from foobar where NAME = '${USER_NAME}';
Hive> select * from foobar where NAME = '${hivevar:USER_NAME}';

ドキュメント:https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution

2
Savio D'Souza

留意すべきことの1つは、文字列を設定してからそれらを参照することです。引用符が衝突しないことを確認する必要があります。

 set start_date = '2019-01-21';
 select ${hiveconf:start_date}; 

文字列が競合する可能性があるため、日付を慎重に設定してからコードで参照する必要があります。これは、上記のstart_dateセットでは機能しません。

 '${hiveconf:start_date}'

開始引用符と終了引用符で変数を設定する場合。クエリで文字列を参照するときに、文字列に二重引用符または二重引用符を設定しないように注意する必要があります。

2
blondie9x

シェルスクリプトエクスポートCURRENT_DATE = "2012-09-16"で変数をエクスポートできます

次に、hiveqlでは、SELECT * FROM foo WHERE day> = '$ {env:CURRENT_DATE}'が好きです

0
dominicrd

この方法を試してください:

set t=20;
select *
from myTable
where age > '${hiveconf:t}'; 

私のプラットフォームではうまく機能します。

0
typhoonbxq