

 Amazon Redshift unterstützt UDFs ab Patch 198 nicht mehr die Erstellung von neuem Python. Das bestehende Python UDFs wird bis zum 30. Juni 2026 weiterhin funktionieren. Weitere Informationen finden Sie im [Blog-Posting](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Python-Sprachunterstützung für UDFs
<a name="udf-python-language-support"></a>

Sie können auf der Basis von Python benutzerdefinierte Funktionen (UDFs, User-Defined Functions) erstellen. Die [Python 2.7-Standardbibliothek](https://docs.python.org/2/library/index.html) ist für die Verwendung in verfügbar UDFs, mit Ausnahme der folgenden Module:
+ ScrolledText
+ Tix
+ Tkinter
+ tk
+ turtle
+ smtpd

Neben der Python-Standardbibliothek sind in die Amazon-Redshift-Implementation die folgenden Module integriert:
+ [numpy 1.8.2](http://www.numpy.org/)
+ [pandas 0.14.1](https://pandas.pydata.org/)
+ [python-dateutil 2.2](https://dateutil.readthedocs.org/en/latest/)
+ [pytz 2014.7](https://pypi.org/project/pytz/2014.7/)
+ [scipy 0.12.1](https://www.scipy.org/)
+ [six 1.3.0](https://pypi.org/project/six/1.3.0/)
+ [wsgiref 0.1.2](https://pypi.python.org/pypi/wsgiref)

Sie können auch Ihre eigenen benutzerdefinierten Python-Module importieren und sie für die Verwendung in verfügbar machen, UDFs indem Sie einen [CREATE LIBRARY](r_CREATE_LIBRARY.md) Befehl ausführen. Weitere Informationen finden Sie unter [Beispiel: Importieren von benutzerdefinierten Python-Bibliotheksmodulen](udf-importing-custom-python-library-modules.md).

**Wichtig**  
Amazon Redshift blockiert den gesamten Netzwerkzugriff und Schreibzugriff auf das Dateisystem durch UDFs.

**Anmerkung**  
Python 3 ist für Python nicht verfügbar UDFs. Um Python 3-Unterstützung für Amazon Redshift zu erhalten UDFs, verwenden Sie [Skalares Lambda UDFs](udf-creating-a-lambda-sql-udf.md) stattdessen.

# Beispiel: Importieren von benutzerdefinierten Python-Bibliotheksmodulen
<a name="udf-importing-custom-python-library-modules"></a>

Skalare Funktionen werden entsprechend der Syntax von Python definiert. Sie können Module der Python-Standardbibliothek und vorinstallierte Amazon-Redshift-Module verwenden. Sie können auch eigene benutzerdefinierte Python-Bibliotheksmodule erstellen und zusammen mit anderen Bibliotheken von Python oder Drittanbietern in Ihre Cluster importieren. 

Die erstellten Bibliotheken dürfen jedoch nicht genau so heißen wie die integrierten Python-Standardbibliotheksmodule oder die vorinstallierten Amazon-Redshift-Python-Module. Wenn eine vorhandene, benutzerinstallierte Bibliothek dasselbe Python-Paket wie eine von Ihnen erstellte Bibliothek verwendet, müssen Sie die vorhandene Bibliothek entfernen, bevor Sie die neue Bibliothek installieren. 

Sie müssen Superuser sein oder über die Berechtigung `USAGE ON LANGUAGE plpythonu` verfügen, um benutzerdefinierte Bibliotheken installieren zu können. Die installierten Bibliotheken können anschließend von allen Benutzern mit der Berechtigung zum Erstellen von Funktionen verwendet werden. Um Informationen zu den in Ihrem Cluster installierten Bibliotheken anzuzeigen, führen Sie eine Abfrage über dem Systemkatalog [PG\$1LIBRARY](r_PG_LIBRARY.md) aus.

## So importieren Sie ein benutzerdefiniertes Python-Modul in Ihren Cluster:
<a name="udf-import-custom-python-module-procedure"></a>

Dieser Abschnitt enthält ein Beispiel zum Importieren eines benutzerdefiniertes Python-Moduls in Ihren Cluster. Für die Durchführung der Schritte in diesem Abschnitt benötigen Sie einen Amazon S3 Bucket, in den Sie das Bibliothekspaket hochladen. Dann installieren Sie das Paket in Ihrem Cluster. Weitere Informationen zum Erstellen von Buckets finden Sie unter [Erstellen von Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html) im *Benutzerhandbuch zu Amazon Simple Storage Service*.

Nehmen wir in diesem Beispiel an, Sie erstellen, UDFs um mit Positionen und Entfernungen in Ihren Daten zu arbeiten. Stellen Sie mit einem SQL-Client-Tool eine Verbindung zu Ihrem Amazon-Redshift-Cluster her und führen die folgenden Befehle aus, um die Funktionen zu erstellen. 

```
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;
```

Beachten Sie, dass in den Funktionen oben einige Codezeilen mehrmals vorkommen. Dies ist notwendig, weil UDFs nicht den Inhalt anderer UDFs referenzieren können, aber beide Funktionen dieselbe Funktionalität benötigen. Natürlich können Sie auch eine benutzerdefinierte Bibliothek mit dem mehrfach verwendeten Code erstellen und Ihre Funktionen so schrieben, dass sie diese Bibliothek verwenden. 

Dazu erstellen Sie zuerst das Bibliothekspaket, indem Sie die folgenden Schritte ausführen: 

1. Erstellen Sie einen Ordner mit dem Namen **geometry**. Dieser Ordner ist das Bibliothekspaket der obersten Ebene.

1. Erstellen Sie im Ordner **geometry** eine Datei mit dem Namen `__init__.py`. Beachten Sie, dass die Unterstriche in dem Dateinamen jeweils doppelte Unterstriche sind. Diese Datei weist Python darauf hin, dass das Paket initialisiert werden kann.

1. Erstellen Sie im Ordner **geometry** außerdem einen Ordner mit dem Namen **trig**. Dieser Ordner ist das Unterpaket der Bibliothek.

1. Erstellen Sie im Ordner **trig** eine Datei mit dem Namen `__init__.py` und eine Datei mit dem Namen `line.py`. Mit der Datei `__init__.py` wird Python wieder darauf hingewiesen, dass das Unterpaket initialisiert werden kann, und dass die Datei `line.py` den Bibliothekscode enthält.

   Ihr Ordner sollte nun eine Dateistruktur wie folgt enthalten: 

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

    Weitere Informationen über die Struktur von Paketen finden Sie unter [Modules](https://docs.python.org/2/tutorial/modules.html) im Python-Tutorial auf der Python-Website. 

1.  Der folgende Quellcode enthält eine Klasse und zugehörige Mitgliedsfunktionen für die Bibliothek. Kopieren Sie den Code und fügen Sie ihn in ein `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)
   ```

 Nachdem Sie das Paket erstellt haben, gehen Sie wie folgt vor, um das Paket vorzubereiten und in Amazon S3 hochzuladen. 

1. Komprimieren Sie den Inhalt des Ordners **geometry** in einer ZIP-Datei mit dem Namen **geometry.zip**. Der Ordner **geometry** selbst darf nicht in der ZIP-Datei enthalten sein, sondern nur der Inhalt des Ordners wie im Folgenden gezeigt: 

   ```
   geometry.zip
      __init__.py
      trig/
         __init__.py
         line.py
   ```

1. Laden Sie **geometry.zip** in Ihren Amazon S3 Bucket hoch.
**Wichtig**  
 Wenn sich der Amazon-S3-Bucket nicht in derselben Region wie Ihr Amazon-Redshift-Cluster befindet, müssen Sie die Option REGION verwenden, um die Region anzugeben, in der sich die Daten befinden. Weitere Informationen finden Sie unter [CREATE LIBRARY](r_CREATE_LIBRARY.md).

1.  Führen Sie in Ihrem SQL-Client-Tool den folgenden Befehl aus, um die Bibliothek zu installieren. *<bucket\$1name>*Ersetzen Sie es durch den Namen Ihres Buckets und ersetzen Sie *<access key id>* und *<secret key>* durch einen Zugriffsschlüssel und einen geheimen Zugriffsschlüssel aus Ihren AWS Identity and Access Management (IAM-) Benutzeranmeldedaten. 

   ```
   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>';
   ```

 Nach der Installation der Bibliothek in Ihrem Cluster müssen Sie die Funktionen so konfigurieren, dass sie die Bibliothek verwenden. Führen Sie dazu die folgenden Befehle aus. 

```
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;
```

In den Befehlen oben können durch die Anweisung `import trig/line` die doppelten Vorkommen des Codes wie in der ersten Version dieser Funktionen am Anfang dieses Abschnitts vermieden werden. Sie können die von dieser Bibliothek bereitgestellten Funktionen mehrfach UDFs wiederverwenden. Beachten Sie, dass Sie beim Importieren des Moduls lediglich den Pfad zu dem Unterpaket und den Modulnamen angeben (`trig/line`). 