

 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.

# Skalares Python UDFs
<a name="udf-creating-a-scalar-udf"></a>

Eine skalare Python-UDF enthält ein Python-Programm, das ausgeführt wird, wenn die Funktion aufgerufen wird, und die Funktion gibt dann einen einzelnen Wert zurück. Der Befehl [CREATE FUNCTION](r_CREATE_FUNCTION.md) wird mit den folgenden Parametern aufgerufen:
+ (Optional) Eingabeparameter, jeweils mit Namen und Datentyp 
+ Ein Rückgabedatentyp
+ Ein ausführbares Python-Programm

Bei den Eingabe- und Rückgabedatentypen für Python UDFs kann es sich um einen der folgenden Typen handeln:
+  SMALLINT 
+  INTEGER 
+  BIGINT 
+  DECIMAL 
+  REAL 
+  DOUBLE PRECISION 
+  BOOLEAN 
+  CHAR 
+  VARCHAR 
+  DATE 
+  TIMESTAMP (ZEITSTEMPEL) 
+  ANYELEMENT 

Die Aliase für diese Typen sind ebenfalls gültig. Die vollständige Liste der Datentypen und ihrer Aliase finden Sie unter [Datentypen](c_Supported_data_types.md).

Wenn Python den Datentyp ANYELEMENT UDFs verwendet, konvertiert Amazon Redshift automatisch in einen Standarddatentyp, der auf den zur Laufzeit bereitgestellten Argumenten basiert. Weitere Informationen finden Sie unter [Datentyp ANYELEMENT](udf-data-types.md#udf-anyelement-data-type).

Wenn eine Amazon-Redshift-Abfrage eine skalare UDF aufruft, wird zur Laufzeit Folgendes durchgeführt.

1. Die Funktion wandelt die Eingabeparameter werden in Python-Datentypen um.

   Ein Mapping von Amazon-Redshift-Datentypen zu Python-Datentypen finden Sie in [Python-UDF-Datentypen](udf-data-types.md).

1. Die Funktion führt das Python-Programm mit den umgewandelten Eingabeparametern aus.

1. Das Python-Programm gibt einen einzelnen Wert zurück. Der Datentyp des Rückgabewerts muss dem RETURNS-Datentyp in der Funktionsdefinition entsprechen.

1. Die Funktion wandelt den Python-Rückgabewert in den angegebenen Amazon-Redshift-Datentyp um und gibt diesen Wert an die Abfrage zurück.

**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 für eine skalare Python-UDF
<a name="udf-scalar-function-example"></a>

Im folgenden Beispiel wird eine Funktion erstellt, die zwei Zahlen vergleicht und die größere zurückgibt. Beachten Sie, dass es sich bei der Einrückung des Codes zwischen den doppelten Dollarzeichen (\$1\$1) um eine Python-Anforderung handelt. Weitere Informationen finden Sie unter [CREATE FUNCTION](r_CREATE_FUNCTION.md).

```
create function f_py_greater (a float, b float)
  returns float
stable
as $$
  if a > b:
    return a
  return b
$$ language plpythonu;
```

In der folgenden Abfrage wird die neue Funktion `f_greater` aufgerufen, um eine Abfrage über der Tabelle SALES auszuführen und entweder COMMISSION oder 20 Prozent von PRICEPAID zurückzugeben, je nachdem, welcher Wert größer ist.

```
select f_py_greater (commission, pricepaid*0.20) from sales;
```

# Python-UDF-Datentypen
<a name="udf-data-types"></a>

Python UDFs kann jeden standardmäßigen Amazon Redshift Redshift-Datentyp für die Eingabeargumente und den Rückgabewert der Funktion verwenden. UDFs Unterstützt zusätzlich zu den Standarddatentypen den Datentyp *ANYELEMENT*, den Amazon Redshift auf der Grundlage der zur Laufzeit bereitgestellten Argumente automatisch in einen Standarddatentyp konvertiert. Scalar UDFs kann den Datentyp ANYELEMENT zurückgeben. Weitere Informationen finden Sie unter [Datentyp ANYELEMENT](#udf-anyelement-data-type).

Während der Ausführung konvertiert Amazon Redshift die Argumente von Amazon-Redshift-Datentypen zu Python-Datentypen zur Verarbeitung. Anschließend wird der Rückgabewert vom Python-Datentyp in den entsprechenden Amazon-Redshift-Datentyp konvertiert. Weitere Informationen zu Amazon-Redshift-Datentypen finden Sie unter [Datentypen](c_Supported_data_types.md).

Die folgende Tabelle enthält eine Zuordnung von Amazon-Redshift-Datentypen und Python-Datentypen.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/redshift/latest/dg/udf-data-types.html)

## Datentyp ANYELEMENT
<a name="udf-anyelement-data-type"></a>

ANYELEMENT ist ein *polymorpher Datentyp*. Wenn eine Funktion unter Verwendung von ANYELEMENT für den Datentyp eines Arguments deklariert wird, kann die Funktion alle Amazon-Redshift-Standarddatentypen als Eingabe für das betreffende Argument akzeptieren, wenn die Funktion aufgerufen wird. Der ANYELEMENT-Parameter wird auf den übergebenen Datentyp gesetzt, wenn die Funktion aufgerufen wird.

Wenn eine Funktion mehrere ANYELEMENT-Datentypen verwendet, werden sie beim Funktionsaufruf alle in denselben Datentyp aufgelöst. Alle ANYELEMENT-Parameter werden auf den Datentyp gesetzt, in den der erste übergebene ANYELEMENT-Parameter aufgelöst wird. Wenn eine Funktion beispielsweise als `f_equal(anyelement, anyelement)` deklariert ist, kann sie zwei beliebige Eingabewerte entgegennehmen, solange diese vom selben Datentyp sind.

Wenn Sie eine Funktion selbst als ANYELEMENT deklarieren, muss mindestens einer der Eingabeparameter vom Typ ANYELEMENT sein. Der tatsächliche Datentyp für den Rückgabewert ist identisch mit dem tatsächlichen Datentyp, der für das ANYELEMENT-Eingabeargument bereitgestellt wird. 

# 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`). 

# Einschränkungen für Python-UDFs
<a name="udf-constraints"></a>

Innerhalb der in diesem Thema aufgeführten Einschränkungen können Sie die integrierten Skalarfunktionen von Amazon Redshift UDFs überall verwenden. Weitere Informationen finden Sie unter [SQL-Funktionsreferenz](c_SQL_functions.md).

Amazon Redshift Python UDFs hat die folgenden Einschränkungen:
+ Python UDFs kann nicht auf das Netzwerk zugreifen oder in das Dateisystem lesen oder schreiben.
+ Die Gesamtgröße von Python-Bibliotheken, die von Benutzern installiert werden, darf 100 MB nicht überschreiten.
+ Amazon Redshift kann jeweils nur eine Python-UDF für bereitgestellte Cluster mit automatischem Workload-Management (WLM) und für Serverless-Arbeitsgruppen ausführen. Wenn Sie versuchen, mehr als eine UDF gleichzeitig auszuführen, stellt Amazon Redshift das verbleibende Python UDFs zur Ausführung in die Warteschlangen für die Arbeitslastverwaltung. SQL hat UDFs kein Parallelitätslimit, wenn automatisches WLM verwendet wird. 
+  Bei der Verwendung von manuellem WLM für bereitgestellte Cluster ist die Anzahl von Python, UDFs die pro Cluster gleichzeitig ausgeführt werden können, auf ein Viertel der gesamten Parallelitätsstufe des Clusters begrenzt. Beispielsweise kann ein bereitgestellter Cluster mit einer Parallelität von 15 maximal drei Python gleichzeitig ausführen. UDFs 
+ Bei Verwendung von Python UDFs unterstützt Amazon Redshift die Datentypen SUPER und HLLSKETCH nicht.

# Fehler und Warnungen in Python protokollieren UDFs
<a name="udf-logging-messages"></a>

Sie können das Python-Logging-Modul verwenden, um benutzerdefinierte Fehler- und Warnmeldungen in Ihrem UDFs zu erstellen. Nach der Abfrageausführung können Sie die Systemansicht [SVL\$1UDF\$1LOG](r_SVL_UDF_LOG.md) abfragen, um protokollierte Meldungen abzurufen.

**Anmerkung**  
Beachten Sie, dass die Protokollierung von UDFs Clusterressourcen verbraucht und die Systemleistung beeinträchtigen kann. Wir empfehlen, die Protokollierung nur in der Entwicklung und zur Problembehandlung zu implementieren. 

Wenn eine Abfrage ausgeführt wird, schreibt der Protokollhandler Meldungen in die Systemansicht SVL\$1UDF\$1LOG, jeweils mit dem betreffenden Funktionsnamen, dem Knoten und der Slice. Der Protokollhandler schreibt jeweils pro Meldung und Slice eine Zeile in SVL\$1UDF\$1LOG. Meldungen werden jeweils auf eine maximale Länge von 4096 Bytes gekürzt. Das UDF-Protokoll ist auf 500 Zeilen pro Slice begrenzt. Wenn das Protokoll voll ist, werden alte Meldungen gelöscht und eine entsprechende Warnmeldung in SVL\$1UDF\$1LOG hinzugefügt.

**Anmerkung**  
Der Amazon-Redshift-UDF-Protokollhandler kodiert Zeilenenden ( `\n` ), Pipe-Zeichen ( `|` ) und umgekehrte Schrägstriche ( `\` ) mit einem umgekehrten Schrägstrich ( `\` ).

Standardmäßig ist die Protokollierungsstufe für UDFs auf WARNING festgelegt. Dies bedeutet, dass Meldungen mit den Protokollierungsstufen WARNING, ERROR und CRITICAL protokolliert werden. Meldungen mit geringerem Schweregrad wie INFO, DEBUG und NOTSET werden ignoriert. Sie können die Protokollierungsstufe für UDF mittels der Python-Methode „logger“ einstellen. Mit dem folgenden Aufruf können Sie beispielsweise die Protokollierungsstufe auf INFO festlegen.

```
logger.setLevel(logging.INFO)
```

Weitere Informationen zur Verwendung des Python-Protokollierungsmoduls finden unter [Logging facility for Python](https://docs.python.org/2.7/library/logging.html) in der Python-Dokumentation.

In dem folgenden Beispiel wird eine Funktion namens „f\$1pyerror“ erstellt, die das Python-Modul zur Protokollierung importiert, das „logger“-Objekt instanziiert und einen Fehler protokolliert.

```
CREATE OR REPLACE FUNCTION f_pyerror() 
RETURNS INTEGER
VOLATILE AS
$$
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.info('Your info message here') 
return 0
$$ language plpythonu;
```

Das folgende Beispiel ist eine SVL\$1UDF\$1LOG-Abfrage zur Anzeige der in dem vorangehenden Beispiel protokollierten Meldung.

```
select funcname, node, slice, trim(message) as message 
from svl_udf_log;

  funcname  | query | node | slice |   message  
------------+-------+------+-------+------------------
  f_pyerror | 12345 |     1|     1 | Your info message here
```