De la ruche -h:
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to Hive
commands. e.g. --hivevar A=B
Je ne pensais pas que les exemples de la documentation étaient adéquats, alors voici ma tentative de réponse.
Au début, il n'y avait que --hiveconf
et la substitution de variable n'existait pas.
L'option --hiveconf
permettait aux utilisateurs de définir valeurs de configuration Hive } à partir de la ligne de commande, et c'était tout. Toutes les valeurs de configuration Hive sont stockées sous l’espace de nom hiveconf
, c’est-à-dire hiveconf:mapred.reduce.tasks
. Ces valeurs vous ont permis de contrôler des éléments tels que le nombre de mappeurs et de réducteurs, si les messages d'état doivent être affichés et si le script doit continuer en cas d'erreur.
Plus tard, la substitution de variable a été ajoutée _. Cela signifie que vous pouvez désormais utiliser des variables dans les requêtes avec la syntaxe ${...}
. Cependant, les seules variables que vous pouviez définir à partir de la ligne de commande se trouvaient dans l'espace de noms hiveconf
à l'aide de --hiveconf
. Les utilisateurs y placent donc leurs variables.
Placer vos variables personnelles dans l'espace de noms de configuration Hive ne cassera probablement rien, mais ce n'est pas non plus une bonne forme. Plus tard, il a été suggéré qu'un espace de nom hivevar
soit ajouté spécifiquement pour les variables utilisateur qui pourraient également être définies sur la ligne de commande à l'aide de --hivevar
. Cela signifiait une séparation plus nette entre les valeurs de configuration Hive et les variables définies par l'utilisateur.
En résumé:
Les espaces de noms hiveconf
et --hiveconf
doivent être utilisés pour définir les valeurs de configuration Hive.
Les espaces de noms hivevar
et --hivevar
doivent être utilisés pour définir les variables utilisateur.
La définition de variables utilisateur sous l’espace de nom hiveconf
ne cassera probablement rien, mais elle n’est pas recommandée.
@Llama l'a expliqué en détail, de même que l'accès aux deux types de variables est différent.
Les variables --hivevar
sont accessibles via ${var-name}
, tandis que les --hiveconf
sont accessibles ${hiveconf:var-name}
dans Hive.
par exemple. Les exemples ci-dessous accèdent à la variable et affichent sa valeur dans Hive.
hivevar:
Hive --hivevar a='this is a' -e '!echo ${a};'
sortie: this is a
hiveconf:
Hive --hiveconf a='this is a' -e '!echo ${hiveconf:a};'
sortie: this is a
Aucune différence sauf l'espace de noms. hiveconf
et hivevar
sont des espaces de noms différents. hivevar
namespace a été ajouté uniquement pour séparer les espaces de noms de propriétés de configuration et de variables Hive. Voir https://issues.Apache.org/jira/browse/Hive-2020 pour plus d'informations.
Vous pouvez vous référer à cela pour la différance
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
Il existe trois espaces de noms pour les variables - hiveconf, system et env. ( Les variables personnalisées peuvent également être créées dans un espace de noms séparé avec l'option define ou hivevar dans Hive 0.8.0 et versions ultérieures.)