Hive QLでSET varname = value
に相当するSQLを探しています
私は次のようなことができることを知っています:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
しかし、私はこのエラーを受け取ります:
ここでは文字「@」はサポートされていません
変数の置換には、特別な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を含めることができますが、変数の一部を「ローカル」に設定できますスクリプトの残りの部分で使用します。
ここでの回答のほとんどは、hiveconf
またはhivevar
名前空間を使用して変数を保存することを示唆しています。そして、それらの答えはすべて正しいです。ただし、もう1つの名前空間があります。
変数を保持するために合計3つのnamespaces
が利用可能です。
したがって、クエリの一部として変数(つまり、dateまたはproduct_number)を保存する場合は、hivevar
名前空間ではなく、hiveconf
名前空間を使用する必要があります。
そして、これがどのように機能するかです。
hiveconfはデフォルトの名前空間のままなので、名前空間を指定しない場合、変数はhiveconf名前空間に保存されます。
ただし、変数の参照に関しては、そうではありません。デフォルトでは、hivevar名前空間を参照します。わかりにくいですよね?次の例でより明確になります。
名前空間を提供しないを実行すると、変数var
はhiveconf
名前空間に格納されます。
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};
ドル記号および括弧を次のように使用してみましたか?
SELECT *
FROM foo
WHERE day >= '${CURRENT_DATE}';
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
留意すべきことの1つは、文字列を設定してからそれらを参照することです。引用符が衝突しないことを確認する必要があります。
set start_date = '2019-01-21';
select ${hiveconf:start_date};
文字列が競合する可能性があるため、日付を慎重に設定してからコードで参照する必要があります。これは、上記のstart_dateセットでは機能しません。
'${hiveconf:start_date}'
開始引用符と終了引用符で変数を設定する場合。クエリで文字列を参照するときに、文字列に二重引用符または二重引用符を設定しないように注意する必要があります。
シェルスクリプトエクスポートCURRENT_DATE = "2012-09-16"で変数をエクスポートできます
次に、hiveqlでは、SELECT * FROM foo WHERE day> = '$ {env:CURRENT_DATE}'が好きです
この方法を試してください:
set t=20;
select *
from myTable
where age > '${hiveconf:t}';
私のプラットフォームではうまく機能します。