wake-up-neo.com

So legen Sie Variablen in Hive-Skripts fest

Ich suche das SQL-Äquivalent von SET varname = value in Hive QL

Ich weiß, dass ich so etwas tun kann: 

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

Dann bekomme ich diesen Fehler:

zeichen '@' wird hier nicht unterstützt

76
user1678312

Sie müssen das spezielle hiveconf für die Variablensubstitution verwenden. z.B.

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

in ähnlicher Weise können Sie die Befehlszeile übergeben:

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

Beachten Sie, dass es auch env und system Variablen gibt, sodass Sie beispielsweise auf ${env:USER} verweisen können.

Führen Sie den Befehl aus, um alle verfügbaren Variablen in der Befehlszeile anzuzeigen

% Hive -e 'set;'

oder von der Hive-Eingabeaufforderung ausführen

Hive> set;

pdate: Ich habe begonnen, Hivevar-Variablen zu verwenden und sie in Hql-Snippets zu setzen, die ich mit Hive CLI einbinden kann den Befehl source (oder über die Befehlszeile als Option -i übergeben). Der Vorteil hierbei ist, dass die Variable dann mit oder ohne das Präfix hivevar verwendet werden kann und eine globale oder lokale Verwendung ermöglicht.

Nehmen wir also an, Sie haben eine setup.hql , die eine Tabellennamenvariable setzt:

set hivevar:tablename=mytable;

dann kann ich in Hive bringen:

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

und in Abfrage verwenden:

Hive> select * from ${tablename}

oder

Hive> select * from ${hivevar:tablename}

Ich könnte auch einen "lokalen" Tabellennamen festlegen, der sich auf die Verwendung von $ {Tabellenname} auswirkt, aber nicht auf $ {hivevar: tablename}.

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

vs

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

Bedeutet wahrscheinlich nicht zu viel von der CLI, kann aber hql in einer Datei haben, die source verwendet, aber einige der Variablen "local" auf setzen Verwenden Sie im Rest des Skripts.

186
libjack

Haben Sie versucht, die Dollarzeichen und Klammern so zu verwenden:

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

Die meisten Antworten hier schlagen vor, entweder den Namespace hiveconf oder hivevar zu verwenden, um die Variable zu speichern. Und alle diese Antworten sind richtig. Es gibt jedoch einen weiteren Namespace. 

Es stehen insgesamt drei namespaces zum Halten von Variablen zur Verfügung. 

  1. hiveconf - Hive hat damit angefangen, die gesamte Hive-Konfiguration wird als Teil dieser Konf. gespeichert. Anfangs war die Variablensubstitution nicht Teil von Hive, und als sie eingeführt wurde, wurden auch alle benutzerdefinierten Variablen als Teil davon gespeichert. Welches ist definitiv keine gute Idee. So wurden zwei weitere Namespaces erstellt. 
  2. hivevar: Zum Speichern von Benutzervariablen
  3. system: Zum Speichern von Systemvariablen. 

Wenn Sie also eine Variable als Teil einer Abfrage speichern (d. H. Datum oder Produktnummer), sollten Sie den Namespace hivevar und nicht den Namespace hiveconf verwenden. 

Und so funktioniert es. 

hiveconf ist immer noch der default-Namespace. Wenn Sie keinen Namespace angeben, wird Ihre Variable im hiveconf-Namespace gespeichert. 

Beim Verweisen auf eine Variable trifft dies jedoch nicht zu. Standardmäßig bezieht es sich auf den Namespace hivevar. Verwirrend, richtig? Es kann mit dem folgenden Beispiel klarer werden. 

Wenn Sie keinen Namespace angeben (siehe unten), wird die Variable var im hiveconf-Namespace gespeichert. 

set var="default_namespace";

Um darauf zugreifen zu können, müssen Sie denhiveconf-Namespace angeben 

select ${hiveconf:var};

Wenn Sie keinen Namespace angeben, erhalten Sie einen Fehler, wie unten erwähnt. Grund dafür ist, dass beim Zugriff auf eine Variable standardmäßig nur der hivevar-Namespace geprüft wird. Und in hivevar gibt es keine Variable namens var

select ${var}; 

Wir haben explizit hivevar-Namespace bereitgestellt 

set hivevar:var="hivevar_namespace";

da wir den Namespace bereitstellen, wird dies funktionieren. 

select ${hivevar:var}; 

Standardmäßig ist der Arbeitsbereich, der beim Verweisen auf eine Variable verwendet wird, hivevar. Folgendes funktioniert auch. 

select ${var};
2
Gaurang Shah

Zwei einfache Möglichkeiten: 

Verwenden von Hive conf

Hive> set USER_NAME='FOO';
Hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';

Verwenden von Hive-Variablen

Legen Sie in Ihrem CLI vars fest und verwenden Sie sie dann in Hive

set hivevar:USER_NAME='FOO';

Hive> select * from foobar where NAME = '${USER_NAME}';
Hive> select * from foobar where NAME = '${hivevar:USER_NAME}';

Dokumentation:https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution

1
Savio D'Souza

Eine Sache, die man beachten sollte, ist das Setzen von Strings und das Zurücksetzen auf sie. Sie müssen sicherstellen, dass die Zitate nicht kollidieren.

 set start_date = '2019-01-21';
 select ${hiveconf:start_date}; 

Seien Sie vorsichtig, wenn Sie Datumsangaben vornehmen und dann im Code darauf verweisen, da die Zeichenfolgen Konflikte verursachen können. Dies würde mit dem oben eingestellten start_date nicht funktionieren.

 '${hiveconf:start_date}'

Beim Setzen von Variablen mit Start- und Endanführungszeichen. Wir müssen darauf achten, dass Sie einfache oder doppelte Anführungszeichen für Zeichenfolgen nicht doppelt setzen, wenn Sie in der Abfrage darauf zurückgreifen.

1
blondie9x

Sie können die Variable im Shell-Skript exportieren. Export CURRENT_DATE = "2012-09-16"

Dann gefällt dir in hiveql SELECT * FROM foo WHERE day> = '$ {env: CURRENT_DATE}'

0
dominicrd

Versuchen Sie diese Methode:

set t=20;
select *
from myTable
where age > '${hiveconf:t}'; 

es funktioniert gut auf meiner Plattform.

0
typhoonbxq