Je recherche l'équivalent SQL de SET varname = value
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:
le caractère «@» n'est pas pris en charge ici
Réponses:
Vous devez utiliser le hiveconf spécial pour la substitution de variables. par exemple
de même, vous pouvez passer en ligne de commande:
Notez qu'il existe également des variables env et système , vous pouvez donc y faire référence
${env:USER}
par exemple.Pour voir toutes les variables disponibles, à partir de la ligne de commande, exécutez
ou à partir de l'invite de la ruche, exécutez
Mise à jour: J'ai également commencé à utiliser des variables hivevar , en les plaçant dans des extraits de code hql que je peux inclure à partir de la CLI de la ruche en utilisant la
source
commande (ou en passant l'option -i à partir de la ligne de commande). L'avantage ici est que la variable peut ensuite être utilisée avec ou sans le préfixe hivevar, et permettre quelque chose qui s'apparente à une utilisation globale ou locale.Donc, supposons que vous ayez un fichier setup.hql qui définit une variable de nom de table :
alors, je peux mettre en ruche:
et utiliser dans la requête:
ou
Je pourrais également définir un nom de table "local", ce qui affecterait l'utilisation de $ {nom_table}, mais pas de $ {hivevar: nom_table}
contre
Cela ne veut probablement pas dire trop de la CLI, mais peut avoir hql dans un fichier qui utilise la source , mais définir certaines des variables "localement" à utiliser dans le reste du script.
la source
set CURRENT_DATE='2012-09-16';
vous pouvez vous y référer plus tard avec${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
La plupart des réponses ici ont suggéré d'utiliser
hiveconf
ou d'hivevar
espace de noms pour stocker la variable. Et toutes ces réponses sont justes. Cependant, il existe un autre espace de noms.Il y en a au total trois
namespaces
disponibles pour contenir des variables.Et donc, si vous stockez une variable dans le cadre d'une requête (c'est-à-dire date ou numéro_produit), vous devez utiliser l'
hivevar
espace de noms et non l'hiveconf
espace de noms.Et voici comment cela fonctionne.
hiveconf est toujours l' espace de noms par défaut , donc si vous ne fournissez aucun espace de noms, il stockera votre variable dans l'espace de noms hiveconf.
Cependant, quand il s'agit de référencer une variable, ce n'est pas vrai. Par défaut, il fait référence à l' espace de noms hivevar . Confus, non? Cela peut devenir plus clair avec l'exemple suivant.
Si vous ne fournissez pas d'espace de noms comme mentionné ci-dessous, la variable
var
sera stockée dans l'hiveconf
espace de noms.Donc, pour y accéder, vous devez spécifier l'
hiveconf
espace de nomsEt si vous ne fournissez pas d'espace de noms, cela vous donnera une erreur comme mentionné ci-dessous, la raison étant que, par défaut, si vous essayez d'accéder à une variable, elle ne vérifie que dans l'
hivevar
espace de noms. Ethivevar
il n'y a pas de variable nomméevar
Nous avons explicitement fourni un
hivevar
espace de nomscomme nous fournissons l'espace de noms, cela fonctionnera.
Et par défaut, l'espace de travail utilisé lors de la référence d'une variable est
hivevar
, ce qui suit fonctionnera également.la source
Avez-vous essayé d'utiliser le signe dollar et les parenthèses comme ceci:
la source
Deux moyens simples:
Utilisation de la configuration de la ruche
Utilisation des var de la ruche
Sur votre ensemble de CLI, utilisez-les dans la ruche
Documentation: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
la source
Une chose à garder à l'esprit est de définir des chaînes, puis de s'y référer. Vous devez vous assurer que les citations ne se heurtent pas.
Lorsque vous définissez des dates, faites-leur référence dans le code car les chaînes peuvent entrer en conflit. Cela ne fonctionnerait pas avec le set start_date ci-dessus.
Nous devons garder à l'esprit de ne pas définir deux guillemets simples ou doubles pour les chaînes lorsque vous vous y référez dans la requête.
la source
Juste au cas où quelqu'un aurait besoin de paramétrer la requête de la ruche via cli.
Par exemple:
hive_query.sql
Maintenant, exécutez le fichier sql ci-dessus à partir de cli:
la source
Essayez cette méthode:
cela fonctionne bien sur ma plateforme.
la source
Vous pouvez exporter la variable dans le script shell export CURRENT_DATE = "2012-09-16"
Ensuite, dans hiveql, vous aimez SELECT * FROM foo WHERE day> = '$ {env: CURRENT_DATE}'
la source
Vous pouvez stocker la sortie d'une autre requête dans une variable et cette dernière vous pouvez utiliser la même chose dans votre code:
la source