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
Aber dann bekomme ich diesen Fehler:
Zeichen '@' wird hier nicht unterstützt
Antworten:
Sie müssen die spezielle Hiveconf für die Variablensubstitution verwenden. z.B
Ebenso können Sie die Befehlszeile weitergeben:
Beachten Sie, dass es auch env- und Systemvariablen gibt , auf die Sie
${env:USER}
beispielsweise verweisen können .Führen Sie die Befehlszeile aus, um alle verfügbaren Variablen anzuzeigen
oder führen Sie an der Eingabeaufforderung "Hive" aus
Update: Ich habe begonnen, auch Hivevar- Variablen zu verwenden und sie in HQL-Snippets einzufügen, die ich mithilfe des
source
Befehls aus der Hive-CLI einschließen kann (oder als -i-Option über die Befehlszeile übergeben kann). Der Vorteil hierbei ist, dass die Variable dann mit oder ohne das Präfix hivevar verwendet werden kann und eine ähnliche globale oder lokale Verwendung zulässt.Nehmen wir also an, Sie haben eine setup.hql, die eine Tabellennamenvariable setzt:
dann kann ich in den Bienenstock bringen:
und in Abfrage verwenden:
oder
Ich könnte auch einen "lokalen" Tabellennamen festlegen, der sich auf die Verwendung von $ {Tabellenname} auswirkt, nicht jedoch auf $ {hivevar: Tabellenname}
vs.
Bedeutet wahrscheinlich nicht zu viel von der CLI, kann aber hql in einer Datei haben, die den Quellcode verwendet , aber einige der Variablen "lokal" festlegen, um sie im Rest des Skripts zu verwenden.
quelle
set CURRENT_DATE='2012-09-16';
, können Sie später mit${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
Die meisten Antworten hier haben vorgeschlagen, entweder
hiveconf
oder einenhivevar
Namespace zum Speichern der Variablen zu verwenden. Und all diese Antworten sind richtig. Es gibt jedoch noch einen Namespace.namespaces
Für das Halten von Variablen stehen insgesamt drei zur Verfügung.Wenn Sie also eine Variable als Teil einer Abfrage speichern (dh Datum oder Produktnummer), sollten Sie den
hivevar
Namespace und nicht denhiveconf
Namespace verwenden.Und so funktioniert es.
hiveconf ist immer noch der Standard-Namespace . Wenn Sie also keinen Namespace angeben, wird Ihre Variable im hiveconf-Namespace gespeichert.
Wenn es jedoch darum geht, eine Variable zu referenzieren, ist dies nicht der Fall. Standardmäßig bezieht es sich auf den Hivevar- Namespace. Verwirrend, richtig? Mit dem folgenden Beispiel kann dies klarer werden.
Wenn Sie keinen Namespace wie unten angegeben angeben, wird die Variable
var
imhiveconf
Namespace gespeichert .Um darauf zugreifen zu können, müssen Sie einen
hiveconf
Namespace angebenWenn Sie keinen Namespace angeben , wird ein Fehler angezeigt, wie unten erwähnt. Dies liegt daran, dass beim Versuch, auf eine Variable zuzugreifen, standardmäßig
hivevar
nur der Namespace überprüft wird . Und darinhivevar
ist keine Variable benanntvar
Wir haben den
hivevar
Namespace explizit angegebenDa wir den Namespace bereitstellen, funktioniert dies.
Standardmäßig wird beim Verweisen auf eine Variable
hivevar
der folgende Arbeitsbereich verwendet .quelle
Haben Sie versucht, das Dollarzeichen und die Klammern wie folgt zu verwenden:
quelle
Zwei einfache Möglichkeiten:
Mit hive conf
Hive Vars verwenden
Stellen Sie auf Ihrer CLI vars ein und verwenden Sie sie dann in hive
Dokumentation: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
quelle
Eine Sache, die Sie beachten sollten, ist, Zeichenfolgen zu setzen und dann auf sie zurückzugreifen. Sie müssen sicherstellen, dass die Anführungszeichen nicht kollidieren.
Wenn Sie Datumsangaben festlegen, beziehen Sie sich im Code auf diese, da die Zeichenfolgen Konflikte verursachen können. Dies würde mit dem oben eingestellten start_date nicht funktionieren.
Wir müssen darauf achten, keine doppelten einfachen oder doppelten Anführungszeichen für Zeichenfolgen zu setzen, wenn wir in der Abfrage darauf zurückgreifen.
quelle
Nur für den Fall, dass jemand die Hive-Abfrage über CLI parametrisieren muss.
Zum Beispiel:
hive_query.sql
Führen Sie nun die obige SQL-Datei von cli aus:
quelle
Versuchen Sie diese Methode:
es funktioniert gut auf meiner Plattform.
quelle
Sie können die Variable im Shell-Skript exportieren. Export CURRENT_DATE = "2012-09-16"
Dann magst du in hiveql SELECT * FROM foo WHERE day> = '$ {env: CURRENT_DATE}'
quelle
Sie können die Ausgabe einer anderen Abfrage in einer Variablen speichern und letztere in Ihrem Code verwenden:
quelle