Python-Sprachunterstützung für UDFs - Amazon Redshift

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

Sie können eine benutzerdefinierte Version erstellen, die auf der Programmiersprache Python UDF basiert. Die Python 2.7-Standardbibliothek ist für die Verwendung in verfügbarUDFs, 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:

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 Befehl ausführen. Weitere Informationen finden Sie unter Importieren von benutzerdefinierten Python-Bibliotheksmodulen.

Wichtig

Amazon Redshift blockiert den gesamten Netzwerkzugriff und Schreibzugriff auf das Dateisystem durchUDFs.

Anmerkung

Python 3 ist für Python nicht verfügbarUDFs. Um Python 3-Unterstützung für Amazon Redshift zu erhaltenUDFs, verwenden Sie Ein skalares Lambda erstellen UDF stattdessen.

Importieren von benutzerdefinierten Python-Bibliotheksmodulen

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_LIBRARY aus.

So importieren Sie ein benutzerdefiniertes Python-Modul in Ihren Cluster:

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 im Benutzerhandbuch zu Amazon Simple Storage Service.

Nehmen wir in diesem Beispiel an, dass Sie etwas erstellen, UDFs um mit Positionen und Entfernungen in Ihren Daten zu arbeiten. Stellen Sie über ein SQL Client-Tool eine Connect zu Ihrem Amazon Redshift Redshift-Cluster her und führen Sie 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. Diese Duplizierung ist notwendig, da a UDF nicht auf den Inhalt einer anderen UDF verweisen kann und 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.

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

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

  4. 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 im Python-Tutorial auf der Python-Website.

  5. 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
  2. Laden Sie geometry.zip in Ihren Amazon S3 Bucket hoch.

    Wichtig

    Wenn sich der Amazon S3 S3-Bucket nicht in derselben Region wie Ihr Amazon Redshift Redshift-Cluster befindet, müssen Sie die REGION Option verwenden, um die Region anzugeben, in der sich die Daten befinden. Weitere Informationen finden Sie unter CREATE LIBRARY.

  3. Führen Sie in Ihrem SQL Client-Tool den folgenden Befehl aus, um die Bibliothek zu installieren. Ersetzen <bucket_name> mit dem Namen Ihres Buckets und ersetzen Sie <access key id> and <secret key> mit einem Zugriffsschlüssel und einem 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 wiederverwendenUDFs. Beachten Sie, dass Sie beim Importieren des Moduls lediglich den Pfad zu dem Unterpaket und den Modulnamen angeben (trig/line).