115 votes

Comment définir des variables dans les scripts HIVE

Je recherche l'équivalent SQL de "SET nomvar = valeur" dans Hive QL

Je sais que je peux faire quelque chose comme ça:

 SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
 

Mais alors j'obtiens cette erreur "caractère '@' non supporté ici"

225voto

libjack Points 2353

Vous devez utiliser le hiveconf pour la substitution de variables. par exemple

hive> set CURRENT_DATE='2012-09-16';
hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'

de même, vous pouvez passer sur la ligne de commande:

% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql

Notez qu'il y a env et système de variables, de sorte que vous pouvez référencer ${env:USER} par exemple.

Pour voir toutes les variables disponibles, à partir de la ligne de commande, exécutez

% hive -e 'set;'

ou de la ruche d'invite de commandes, exécutez

hive> set;

Mise à jour: J'ai commencé à utiliser des hivevar variables ainsi, de les mettre en hql des extraits que j'ai peut inclure de la ruche à l'aide de la CLI source de commande (ou à passer à l'as-i, option de ligne de commande). L'avantage ici est que la variable peut être utilisée avec ou sans la hivevar préfixe, et de permettre quelque chose qui s'apparente à global vs local de l'utiliser.

Ainsi, supposons que certains ont de l'installation.hql qui définit un tablename variable:

set hivevar:tablename=mytable;

alors, je peux l'amener dans la ruche:

hive> source /path/to/setup.hql;

et à utiliser dans la requête:

hive> select * from ${tablename}

ou

hive> select * from ${hivevar:tablename}

J'ai également pu définir un "local" nom de la table, ce qui aurait une incidence sur l'utilisation de ${tablename}, mais pas ${hivevar:tablename}

hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'

vs

hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'

Sans doute ne veut pas dire trop de la CLI, mais peut avoir hql dans un fichier qui utilise la source, mais certaines des variables "localement" à utiliser dans le reste du script.

9voto

YABADABADOU Points 557

Avez-vous essayé d'utiliser le signe dollar et les crochets comme ceci:

 SELECT * 
FROM foo 
WHERE day >= '${CURRENT_DATE}';
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X