SET varname = value
Hive QLで同等のSQLを探しています
私はこのようなことができることを知っています:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
しかし、それから私はこのエラーを受け取ります:
文字「@」はここではサポートされていません
SET varname = value
Hive QLで同等の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とシステム変数もあるので${env:USER}
、たとえば参照できることに注意してください。
使用可能なすべての変数を表示するには、コマンドラインから次のコマンドを実行します。
% hive -e 'set;'
またはハイブプロンプトから実行
hive> set;
更新:hivevar変数も
使用し始め、コマンドを使用してhive CLIから含めることができるhqlスニペットにそれらを入れましたsource
(またはコマンドラインから-iオプションとして渡します)。ここでの利点は、変数をhivevarプレフィックスの有無にかかわらず使用でき、グローバルとローカルの使用に似たものを許可することです。
したがって、tablename変数を設定するsetup.hqlがあるとします。
set hivevar:tablename=mytable;
次に、ハイブを持ち込むことができます。
hive> source /path/to/setup.hql;
クエリで使用:
hive> select * from ${tablename}
または
hive> select * from ${hivevar:tablename}
$ {hivevar:tablename}ではなく、$ {tablename}の使用に影響する「ローカル」テーブル名を設定することもできます
hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'
対
hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'
おそらくCLIからはあまり意味がありませんが、sourceを使用するファイルにhqlを含めることができますが、残りのスクリプトで使用するために一部の変数を「ローカル」に設定します。
set CURRENT_DATE='2012-09-16';
ますが、後で参照できます${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
ここでのほとんどの答えは、変数を格納するために、hiveconf
またはhivevar
名前空間を使用することを提案しています。そして、それらすべての答えは正しいです。ただし、名前空間がもう1つあります。
namespaces
変数を保持するために利用可能な合計3つがあります。
したがって、クエリの一部として変数(つまり、日付または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}';
ハイブ変数を使用する
CLIで変数を設定し、ハイブで使用します
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
この方法を試してください:
set t=20;
select *
from myTable
where age > '${hiveconf:t}';
それは私のプラットフォームでうまく機能します。
変数はシェルスクリプトでエクスポートできますexport CURRENT_DATE = "2012-09-16"
次に、hiveqlでSELECT * FROM foo WHERE day> = '$ {env:CURRENT_DATE}'を好みます
別のクエリの出力を変数に格納でき、後者をコードで使用できます。
set var=select count(*) from My_table;
${hiveconf:var};