Support du langage Python pour UDFs - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Support du langage Python pour UDFs

Vous pouvez créer une personnalisation UDF basée sur le langage de programmation Python. La bibliothèque standard Python 2.7 peut être utilisée dansUDFs, à l'exception des modules suivants :

  • ScrolledText

  • Tix

  • Tkinter

  • tk

  • turtle

  • smtpd

En plus de la bibliothèque standard Python, les modules suivants font partie de la mise en œuvre d'Amazon Redshift :

Vous pouvez également importer vos propres modules Python personnalisés et les rendre utilisables en UDFs exécutant une CREATE LIBRARY commande. Pour de plus amples informations, veuillez consulter Importation des modules de la bibliothèque Python personnalisés.

Important

Amazon Redshift bloque tout accès réseau et tout accès en écriture au système de fichiers par le biais du système de fichiers. UDFs

Note

Python 3 n'est pas disponible pour PythonUDFs. Pour bénéficier de la prise en charge de Python 3 pour Amazon RedshiftUDFs, utilisez Création d'un Lambda scalaire UDF plutôt.

Importation des modules de la bibliothèque Python personnalisés

Vous définissez les fonctions scalaires à l'aide de la syntaxe du langage Python. Vous pouvez utiliser les modules de la bibliothèque standard Python et les modules préinstallés d'Amazon Redshift. Vous pouvez également créer vos propres modules de bibliothèque Python personnalisés et importer les bibliothèques dans vos clusters, ou utiliser des bibliothèques existantes de Python ou de tiers.

Vous ne pouvez pas créer une bibliothèque qui contient un module avec le même nom qu'un module de la bibliothèque standard Python ou qu'un module Amazon Redshift préinstallé. Si une bibliothèque existante installée par l'utilisateur emploie le même package Python qu'une bibliothèque que vous créez, vous devez supprimer la bibliothèque existante avant d'installer la nouvelle bibliothèque.

Vous devez être un super-utilisateur ou disposer du privilège USAGE ON LANGUAGE plpythonu pour installer des bibliothèques personnalisées. Toutefois, tous les utilisateurs disposant de privilèges suffisants pour créer des fonctions peuvent utiliser les bibliothèques installées. Vous pouvez interroger le catalogue système PG_LIBRARY pour afficher des informations sur les bibliothèques installées sur votre cluster.

Pour importer un module Python personnalisé dans votre cluster

Cette section fournit un exemple d'importation d'un module Python personnalisé dans votre cluster. Pour effectuer les étapes de cette section, vous devez disposer d'un compartiment Amazon S3, dans lequel vous téléchargez le package de la bibliothèque. Ensuite, vous installez le package dans votre cluster. Pour plus d'informations sur la création de compartiments, consultez Création d'un compartiment dans le Guide de l'utilisateur Amazon Simple Storage Service.

Dans cet exemple, supposons que vous créez UDFs pour travailler avec des positions et des distances dans vos données. Connectez-vous à votre cluster Amazon Redshift à partir d'un outil SQL client et exécutez les commandes suivantes pour créer les fonctions.

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;

Notez que quelques lignes de code sont identiques dans les fonctions précédentes. Cette duplication est nécessaire car a UDF ne peut pas référencer le contenu d'une autre UDF fonction et les deux fonctions nécessitent les mêmes fonctionnalités. Cependant, au lieu de dupliquer le code dans plusieurs fonctions, vous pouvez créer une bibliothèque personnalisée et configurer vos fonctions pour l'utiliser.

Pour ce faire, commencez par créer le package de la bibliothèque en procédant comme suit :

  1. Créez un dossier nommé geometry. Ce dossier constitue le package de niveau supérieur de la bibliothèque.

  2. Dans le geometry, créez un fichier nommé __init__.py. Notez que le nom du fichier contient deux caractères de soulignement doubles. Ce fichier indique à Python que le package peut être initialisé.

  3. Toujours dans le dossier geometry, créez un dossier nommé trig. Ce dossier constitue le sous-package de la bibliothèque.

  4. Dans le dossier trig, créez un autre fichier nommé __init__.py et un fichier nommé line.py. Dans ce dossier, __init__.py indique à Python que le sous-package peut être initialisé et que line.py est le fichier qui contient le code de la bibliothèque.

    Votre structure de dossier et de fichier devrait être la même que la suivante :

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

    Pour plus d'informations sur la structure du package, consultez la section Modules du didacticiel Python sur le site web de Python.

  5. Le code suivant contient une classe et des fonctions de membre pour la bibliothèque. Copiez et collez-le dans 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)

Une fois que vous avez créé le package, procédez comme suit pour préparer le package et chargez-le dans Amazon S3.

  1. Compressez le contenu du dossier geometry dans un fichier .zip nommé geometry.zip. N'incluez pas le dossier geometry lui-même ; incluez uniquement le contenu du dossier comme illustré ci-après :

    geometry.zip __init__.py trig/ __init__.py line.py
  2. Téléchargez geometry.zip dans votre compartiment Amazon S3.

    Important

    Si le compartiment Amazon S3 ne réside pas dans la même région que votre cluster Amazon Redshift, vous devez utiliser l'REGIONoption pour spécifier la région dans laquelle se trouvent les données. Pour de plus amples informations, veuillez consulter CREATE LIBRARY.

  3. À partir de votre outil SQL client, exécutez la commande suivante pour installer la bibliothèque. Remplacez <bucket_name> avec le nom de votre compartiment, et remplacez <access key id> and <secret key> avec une clé d'accès et une clé d'accès secrète provenant de vos informations d'identification utilisateur 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>';

Après avoir installé la bibliothèque dans votre cluster, vous devez configurer vos fonctions en vue d'utiliser la bibliothèque. Pour ce faire, exécutez les commandes suivantes.

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;

Dans les commandes précédentes, import trig/line supprime le code dupliqué des fonctions d'origine dans cette section. Vous pouvez réutiliser les fonctionnalités fournies par cette bibliothèque à plusieurs reprisesUDFs. Notez que pour importer le module, vous ne devez pas spécifier le chemin d'accès au nom du sous-package et du module (trig/line).