Hive -hから:
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to Hive
commands. e.g. --hivevar A=B
ドキュメントの例が適切であるとは思わなかったので、回答を試みました。
最初は--hiveconf
しかなく、変数置換は存在しませんでした。
--hiveconf
オプションを使用すると、ユーザーはコマンドラインから Hive構成値 を設定できました。すべてのHive設定値は、hiveconf
名前空間、つまりhiveconf:mapred.reduce.tasks
の下に保存されます。これらの値を使用すると、ステータスメッセージを表示するかどうか、およびエラー時にスクリプトを続行するかどうかなど、マッパーとリデューサーの数などを制御できます。
後で、 変数置換が追加されました 。これは、${...}
構文のクエリで変数を使用できるようになったことを意味します。ただし、コマンドラインから設定できる変数は--hiveconf
を使用してhiveconf
名前空間の下にあるため、ユーザーが変数を入力する場所です。
Hive構成名前空間の下に個人変数を配置しても、おそらく何も壊れませんが、それはまた良い形ではありません。後で 推奨hivevar
名前空間は、--hivevar
を使用してコマンドラインでも定義できるユーザー変数専用に追加されます。これは、Hive構成値とユーザー定義変数の明確な分離を意味しました。
要約:hiveconf
名前空間と--hiveconf
を使用して、Hive構成値を設定する必要があります。hivevar
名前空間と--hivevar
を使用して、ユーザー変数を定義する必要があります。hiveconf
名前空間の下でユーザー変数を設定しても、おそらく何も壊れませんが、お勧めしません。
@Llamaは、両方のタイプの変数へのアクセス方法が異なることとともに、詳細に説明しています。
--hivevar
変数は${var-name}
を使用してアクセスされ、--hiveconf
はHive内で${hiveconf:var-name}
にアクセスされます。
例えば以下の例では、変数にアクセスし、その値をHiveに出力します。
hivevar:
Hive --hivevar a='this is a' -e '!echo ${a};'
出力:this is a
hiveconf:
Hive --hiveconf a='this is a' -e '!echo ${hiveconf:a};'
出力:this is a
名前空間以外の違いはありません。 hiveconf
とhivevar
は異なる名前空間です。 hivevar
名前空間は、構成プロパティの名前空間とHive変数の名前空間を分離するためだけに追加されました。詳細については、 https://issues.Apache.org/jira/browse/Hive-202 を参照してください。
差異についてはこれを参照できます
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
変数には、hiveconf、system、envの3つの名前空間があります。 ( カスタム変数 は、Hive 0.8.0以降のリリースのdefineまたはhivevarオプションを使用して、別のネームスペースに作成することもできます。)
スクリプトの冒頭で次のように使用することもできます。
hiveconf:
SET this_dt = CURRENT_DATE;
select ${hiveconf:this_dt};
hivevar:
set hivevar:cur_dt=current_date;
select ${hivevar:cur_dt};