Funzione scalare in linguaggio Python
L'esempio seguente mostra una semplice funzione scalare che somma un insieme di numeri. Questo esempio parte dall'inizio per costruire un semplice AE. Utilizza il seguente nome di file: 'applyop.py
Codice
- Derivare una classe da '
nzae.Ae
. La classe base gestisce la maggior parte del lavoro, quindi di solito si chiama il 'class-method "run()"
. La funzione 'run()
istanzia la classe, imposta la gestione degli errori e chiama la funzione derivata appropriata. Per gli AE basati su UDF come questo, la funzione '_getFunctionResult()
deve essere sovrascritta, poiché viene richiamata una volta per ogni riga di input. Salvate il codice seguente in un file chiamato 'applyop.py:import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # OUR CUSTOM CODE WILL GO HERE. ApplyOpUdfAe.run()
- Completare il codice Python personalizzato. In questa UDF si passa un operatore di stringa, che può essere un segno più (+) per aggiungere o un asterisco (*) per moltiplicare, e due numeri interi. Il codice restituisce il prodotto o la somma dei numeri interi. In SQL, una versione semplice di questa funzione può essere richiamata da:
oppureSELECT applyop('+', 3, 5);
SELECT applyop('*', 3, 5);
Sebbene l'esempio citato abbia un solo ingresso, il sistema NPS tratta flussi di ingresso. Pertanto, il sistema NPS ha maggiori probabilità di essere utilizzato:SELECT applyop(mytable.operator, mytable.value1, mytable.value2) FROM mytable;
Nel primo esempio, il sistema NPS prende le costanti "+", 3 e 5 e le trasforma in un flusso di lunghezza uno contenente tre elementi. Una riga è "vista" da '
_getFunctionResult()
con i tre elementi in essa contenuti. Internamente, tutti i casi citati sono gestiti allo stesso modo e si può ipotizzare che ci siano più ingressi all'AE "applyop
. - Immettere il codice personalizzato per gestire una riga di input, poiché il ciclo di gestione dell'input è necessario per consegnare alla funzione una riga alla volta:
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()
La funzione '
self.userError()
segnala un errore all'utente SQL. Ciò che viene restituito da '_getFunctionResult()
è il risultato dell'operazione SQL. Poiché viene eseguita come UDF, il risultato può contenere una sola colonna. Un esempio successivo mostra come usare gli UDTF per produrre più colonne. Quando il codice è completo, deve essere distribuito e registrato.
Compilazione
Gli AE Python non richiedono la compilazione.
Distribuzione
--template
per distribuire lo script nella posizione predefinita dell'unità di esportazione condivisa.$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./applyop.py --version 3
Registrazione
$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
In esecuzione
SELECT applyop('+', 4, 10);
APPLYOP
---------
14
(1 row)
_getFunctionResult()
, viene richiamato 'self.userError()
. L'esempio seguente genera un errore:SELECT applyop('-', 1, 2);
ERROR: Unhandled operator TO ApplyOp: '-'.