

 Amazon Redshift non supporterà più la creazione di nuovi Python UDFs a partire dalla Patch 198. Python esistente UDFs continuerà a funzionare fino al 30 giugno 2026. Per ulteriori informazioni, consulta il [post del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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
<a name="udf-importing-custom-python-library-modules"></a>

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\$1LIBRARY](r_PG_LIBRARY.md) per visualizzare informazioni sulle librerie installate nel cluster.

## Importazione di un modulo Python personalizzato nel cluster
<a name="udf-import-custom-python-module-procedure"></a>

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](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html) 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. 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.

1. 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.

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

1. 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](https://docs.python.org/2/tutorial/modules.html) nel tutorial su Python nel sito Web Python. 

1.  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
   ```

1. 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](r_CREATE_LIBRARY.md).

1.  Dallo strumento client SQL eseguire il comando seguente per installare la libreria. Sostituiscilo *<bucket\$1name>* con il nome del bucket e sostituiscilo *<secret key>* con una chiave di accesso *<access key id>* 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`). 