Supporto del linguaggio Python per funzioni definite dall'utente - Amazon Redshift

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Supporto del linguaggio Python per funzioni definite dall'utente

Puoi creare una funzione definita dall'utente personalizzata basata sul linguaggio di programmazione Python. La libreria standard Python 2.7 può essere usata in funzioni definite dall'utente, con l'eccezione dei moduli seguenti:

  • ScrolledText

  • Tix

  • Tkinter

  • tk

  • turtle

  • smtpd

Oltre alla libreria standard Python, i moduli seguenti fanno parte dell'implementazione di Amazon Redshift:

Puoi anche importare moduli Python personalizzati e renderli disponibili per l'uso in funzioni definite dall'utente eseguendo un comando CREATE LIBRARY. Per ulteriori informazioni, consultare Importazione di moduli di libreria Python personalizzati.

Importante

Amazon Redshift blocca tutto l'accesso di rete e l'accesso in scrittura al file system tramite funzioni definite dall'utente.

Nota

Python 3 non è disponibile per le UDF Python. Per ottenere il supporto di Python 3 per le UDF di Amazon Redshift, usa invece. Creazione di una funzione Lambda definita dall'utente scalare

Importazione di moduli di libreria Python personalizzati

Puoi definire funzioni scalari usando la sintassi del linguaggio Python. È possibile utilizzare i moduli di libreria Python standard e i moduli Amazon Redshift preinstallati. Inoltre è possibile creare moduli di libreria Python personalizzati e importare le librerie nei cluster oppure usare librerie esistenti da Python o da terze parti.

Non è possibile creare una libreria che contiene un modulo con lo stesso nome di un modulo della libreria standard Python o un modulo Python preinstallato in Amazon Redshift. Se una libreria installata dall'utente esistente usa lo stesso pacchetto Python di una libreria creata da te, devi eliminare la libreria esistente prima di installare quella nuova.

Per installare librerie personalizzate, devi essere un utente con privilegi avanzati o avere il privilegio USAGE ON LANGUAGE plpythonu. Tuttavia, qualsiasi utente con privilegi sufficienti per la creazione di funzioni può usare le librerie installate. Puoi eseguire query sul catalogo di sistema PG_LIBRARY per visualizzare informazioni sulle librerie installate nel cluster.

Per importare un modulo Python personalizzato nel cluster

Questa sezione presenta un esempio di importazione di un modulo Python personalizzato nel cluster. Per completare la procedura in questa sezione, è necessario disporre di un bucket Amazon S3 in cui caricare il pacchetto della libreria. Devi quindi installare il pacchetto nel cluster. Per ulteriori informazioni sulla creazione di un bucket, consultare Creazione di un bucket nella Guida per l'utente di Amazon Simple Storage Service.

In questo esempio, supponi di aver creato funzioni definite dall'utente per usarle con posizioni e distanze nei dati. Connettersi al cluster Amazon Redshift da uno strumento client SQL ed eseguire i comandi seguenti per creare le funzioni.

CREATE FUNCTION f_distance (x1 float, y1 float, x2 float, y2 float) RETURNS float IMMUTABLE as $$ def distance(x1, y1, x2, y2): import math return math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2) return distance(x1, y1, x2, y2) $$ LANGUAGE plpythonu; CREATE FUNCTION f_within_range (x1 float, y1 float, x2 float, y2 float) RETURNS bool IMMUTABLE as $$ def distance(x1, y1, x2, y2): import math return math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2) return distance(x1, y1, x2, y2) < 20 $$ LANGUAGE plpythonu;

Come puoi notare, nell'esempio precedente alcune righe di codice sono duplicate. Queste righe duplicate sono necessarie, perché una funzione definita dell'utente non può fare riferimento al contenuto di un'altra funzione definita dall'utente ed entrambe le funzioni devono avere le stesse funzionalità. Tuttavia, invece di duplicare il codice in più funzioni, puoi creare una libreria personalizzata e configurare le funzioni perché la usino.

A questo scopo, crea prima di tutto il pacchetto della libreria completando questa procedura:

  1. Creare una cartella denominata geometry. Questa cartella è il pacchetto di primo livello della libreria.

  2. Nella cartella geometry creare un file denominato __init__.py. Notare che il nome del file contiene due caratteri di sottolineatura doppi. Questo file indica a Python che il pacchetto può essere inizializzato.

  3. Nella cartella geometry creare una cartella denominata trig. Questa cartella è il sottopacchetto della libreria.

  4. Nella cartella trig creare un altro file denominato __init__.py e un file denominato line.py. In questa cartella __init__.py indica a Python che il sottopacchetto può essere inizializzato e che line.py è il file che contiene il codice della libreria.

    La struttura dei file e delle cartelle deve essere uguale alla seguente:

    geometry/ __init__.py trig/ __init__.py line.py

    Per ulteriori informazioni sulla struttura dei pacchetti, consultare la pagina relativa ai moduli nel tutorial su Python nel sito Web Python.

  5. Il codice seguente contiene una classe e funzioni membro per la libreria. Copiare e incollare il codice in line.py.

    class LineSegment: def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 def angle(self): import math return math.atan2(self.y2 - self.y1, self.x2 - self.x1) def distance(self): import math return math.sqrt((self.y2 - self.y1) ** 2 + (self.x2 - self.x1) ** 2)

Dopo aver creato il pacchetto, completare le operazioni seguenti per prepararlo e caricarlo in Amazon S3.

  1. Comprimere il contenuto della cartella geometry in un file ZIP denominato geometry.zip. Non includere la cartella geometry stessa, ma solo il contenuto della cartella, come mostrato di seguito:

    geometry.zip __init__.py trig/ __init__.py line.py
  2. Caricare geometry.zip sul bucket Amazon S3.

    Importante

    Se il bucket Amazon S3 non si trova nella stessa regione del cluster Amazon Redshift, è necessario utilizzare l'opzione REGION per specificare la regione in cui si trovano i dati. Per ulteriori informazioni, consultare CREATE LIBRARY.

  3. Dallo strumento client SQL eseguire il comando seguente per installare la libreria. <bucket_name>Sostituiscilo con il nome del tuo bucket e sostituiscilo <access key id><secret key>con una chiave di accesso e una chiave di accesso segreta ricavate dalle tue credenziali utente AWS Identity and Access Management (IAM).

    CREATE LIBRARY geometry LANGUAGE plpythonu FROM 's3://<bucket_name>/geometry.zip' CREDENTIALS 'aws_access_key_id=<access key id>;aws_secret_access_key=<secret key>';

Dopo aver installato la libreria nel cluster, devi configurare le funzioni per l'uso della libreria. A questo scopo, esegui i comandi seguenti.

CREATE OR REPLACE FUNCTION f_distance (x1 float, y1 float, x2 float, y2 float) RETURNS float IMMUTABLE as $$ from trig.line import LineSegment return LineSegment(x1, y1, x2, y2).distance() $$ LANGUAGE plpythonu; CREATE OR REPLACE FUNCTION f_within_range (x1 float, y1 float, x2 float, y2 float) RETURNS bool IMMUTABLE as $$ from trig.line import LineSegment return LineSegment(x1, y1, x2, y2).distance() < 20 $$ LANGUAGE plpythonu;

Nei comandi precedenti import trig/line elimina il codice duplicato dalle funzioni originali in questa sezione. Puoi riutilizzare la funzionalità fornita da questa libreria in più funzioni definite dall'utente. Tieni presente che per importare il modulo, devi solo specificare il percorso del sottopacchetto e il nome del modulo (trig/line).