Skalare Funktion in der Sprache Python
Das folgende Beispiel zeigt eine einfache skalare Funktion, die eine Reihe von Zahlen summiert. Dieses Beispiel beginnt mit der Konstruktion einer einfachen AE. Er verwendet den folgenden Dateinamen: ' applyop.py
Code erstellen
- Eine Klasse von '
nzae.Ae
ableiten. Die Basisklasse übernimmt den größten Teil der Arbeit, so dass Sie normalerweise die Klasse 'class-method "run()"
aufrufen. Die Funktion "run()
instanziiert die Klasse, richtet die Fehlerbehandlung ein und ruft die entsprechende abgeleitete Funktion auf. Bei UDF-basierten AEs wie dieser muss die Funktion "_getFunctionResult()
überschrieben werden, da sie für jede Eingabezeile einmal aufgerufen wird. Speichern Sie den folgenden Code in einer Datei mit dem Namen " applyop.py:import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # OUR CUSTOM CODE WILL GO HERE. ApplyOpUdfAe.run()
- Vervollständigen Sie den benutzerdefinierten Python. In dieser UDF geben Sie einen String-Operator ein, der entweder ein Pluszeichen (+) zum Addieren oder ein Sternchen (*) zum Multiplizieren ist, sowie zwei ganze Zahlen. Der Code gibt entweder das Produkt oder die Summe der ganzen Zahlen zurück. In SQL kann eine einfache Version davon entweder aufgerufen werden durch:
oderSELECT applyop('+', 3, 5);
SELECT applyop('*', 3, 5);
Obwohl das genannte Beispiel nur einen Eingang hat, arbeitet das NPS-System mit Eingangsströmen. Daher wird das NPS-System mit größerer Wahrscheinlichkeit genutzt:SELECT applyop(mytable.operator, mytable.value1, mytable.value2) FROM mytable;
Im ersten Beispiel nimmt das NPS-System die Konstanten "+", 3 und 5 und wandelt sie in einen Stream der Länge 1 um, der drei Elemente enthält. Eine Zeile wird von '
_getFunctionResult()
mit den drei Elementen darin "gesehen". Intern werden alle genannten Fälle auf die gleiche Weise behandelt, und es kann davon ausgegangen werden, dass es mehrere Eingänge für die AE "applyop
gibt. - Geben Sie benutzerdefinierten Code ein, um eine Zeile der Eingabe zu verarbeiten, da eine Schleifenverarbeitung der Eingabe erforderlich ist, um jeweils eine Zeile an die Funktion weiterzugeben:
import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # BREAK APART OUR ROW OF INPUT. operator, leftInput, rightInput = row # HANDLE ADDITION. if operator == "+": return leftInput + rightInput # HANDLE MULTIPLICATION. if operator == "*": return leftInput * rightInput # ERROR ON ALL OTHER. self.userError("Unhandled operator to ApplyOp: '" + operator + "'.") ApplyOpUdfAe.run()
Die Funktion '
self.userError()
meldet einen Fehler an den SQL-Benutzer. Was auch immer durch '_getFunctionResult()
' zurückgegeben wird, ist das Ergebnis der SQL-Operation. Da dies als UDF ausgeführt wird, kann das Ergebnis nur eine Spalte enthalten. Ein späteres Beispiel zeigt, wie man UDTFs zur Ausgabe mehrerer Spalten verwendet. Wenn der Code vollständig ist, muss er bereitgestellt und registriert werden.
Kompilierung
Die Python müssen nicht kompiliert werden.
Bereitstellung
--template
verwendet, um das Skript am Standardspeicherort auf dem gemeinsamen Exportlaufwerk zu verteilen.$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./applyop.py --version 3
Registrierung
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udf --exe applyop.py --sig "applyop(varchar(1), int4, int4)" \
--return int4
Aktiv
SELECT applyop('+', 4, 10);
APPLYOP
---------
14
(1 row)
_getFunctionResult()
" self.userError()
aufgerufen wird. Das folgende Beispiel löst einen Fehler aus:SELECT applyop('-', 1, 2);
ERROR: Unhandled operator TO ApplyOp: '-'.