Esempio: importazione di moduli di libreria Python personalizzati - 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à.

Esempio: 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.

Importazione di 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, supponiamo che tu crei UDFs per lavorare con posizioni e distanze nei tuoi dati. Connettiti al tuo cluster Amazon Redshift da uno strumento SQL client ed esegui i seguenti comandi 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. Questa duplicazione è necessaria perché a UDF non può fare riferimento al contenuto di un'altra UDF ed entrambe le funzioni richiedono la stessa 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, devi utilizzare l'REGIONopzione per specificare la regione in cui si trovano i dati. Per ulteriori informazioni, consulta CREATE LIBRARY.

  3. Dal tuo strumento SQL client, esegui il comando seguente per installare la libreria. Replace (Sostituisci) <bucket_name> con il nome del tuo bucket e sostituiscilo <access key id> e <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. È possibile riutilizzare le funzionalità fornite da questa libreria in più modi. UDFs Tieni presente che per importare il modulo, devi solo specificare il percorso del sottopacchetto e il nome del modulo (trig/line).