Von Bienenstock -h:
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to Hive
commands. e.g. --hivevar A=B
Ich hatte nicht das Gefühl, dass die Beispiele aus der Dokumentation angemessen waren, daher hier mein Versuch einer Antwort.
Am Anfang gab es nur --hiveconf
und die Variablensubstitution existierte nicht.
Mit der --hiveconf
-Option können Benutzer Hive-Konfigurationswerte von der Befehlszeile aus festlegen, und das war es. Alle Hive-Konfigurationswerte werden unter dem Namespace hiveconf
gespeichert, d. H. hiveconf:mapred.reduce.tasks
. Mit diesen Werten haben Sie die Möglichkeit, die Anzahl der Mapper und Reduktionen, die Anzeige von Statusmeldungen und die Fehlerbehebung des Skripts zu steuern.
Später wurde Variablensubstitution hinzugefügt . Dies bedeutet, dass Sie jetzt Variablen in Abfragen mit der ${...}
-Syntax verwenden können. Die einzigen Variablen, die Sie über die Befehlszeile festlegen konnten, befanden sich jedoch unter Verwendung von --hiveconf
im Namespace hiveconf
. Daher setzen Benutzer ihre Variablen.
Wenn Sie Ihre persönlichen Variablen unter den Namensraum der Hive-Konfiguration stellen, wird dies wahrscheinlich nichts kaputt machen, aber es ist auch keine gute Form. Später wurde es wurde vorgeschlagen , dass ein hivevar
-Namespace speziell für Benutzervariablen hinzugefügt wird, der auch in der Befehlszeile mit --hivevar
definiert werden kann. Dies bedeutete eine sauberere Trennung zwischen Hive-Konfigurationswerten und benutzerdefinierten Variablen.
In Summe:
Der Namespace hiveconf
und --hiveconf
sollten verwendet werden, um Hive-Konfigurationswerte festzulegen.
Der hivevar
-Namespace und --hivevar
sollten zur Definition von Benutzervariablen verwendet werden.
Das Festlegen von Benutzervariablen unter dem Namespace hiveconf
führt wahrscheinlich nicht zu Fehlern, wird jedoch nicht empfohlen.
@Llama hat es ausführlich erklärt, und auf beide Arten von Variablen wird unterschiedlich zugegriffen.
Auf die --hivevar
-Variablen wird mit ${var-name}
zugegriffen, während auf --hiveconf
innerhalb von Hive auf ${hiveconf:var-name}
zugegriffen wird.
z.B. Nachfolgend einige Beispiele für Zugriffsvariablen und deren Druck in Hive.
hivevar:
Hive --hivevar a='this is a' -e '!echo ${a};'
ausgabe: this is a
hiveconf:
Hive --hiveconf a='this is a' -e '!echo ${hiveconf:a};'
ausgabe: this is a
Kein Unterschied außer dem Namensraum. hiveconf
und hivevar
sind unterschiedliche Namespaces. hivevar
Namespace wurde hinzugefügt, um den Namespace der Konfigurationseigenschaften und den Hive-Variablen-Namespace voneinander zu trennen. Weitere Informationen finden Sie unter https://issues.Apache.org/jira/browse/Hive-2020 .
Sie können dies für die Differenz verweisen
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
Es gibt drei Namespaces für Variablen - hiveconf, system und env. ( Benutzerdefinierte Variablen können auch in einem separaten Namespace mit der Option define oder hivevar in Hive 0.8.0 und späteren Releases erstellt werden.)
Wir können sie auch am Anfang des Skripts verwenden als:
hiveconf:
SET this_dt = CURRENT_DATE;
select ${hiveconf:this_dt};
hivevar:
set hivevar:cur_dt=current_date;
select ${hivevar:cur_dt};