Création d'une fonction scalaire Python définie par l'utilisateur - 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.

Création d'une fonction scalaire Python définie par l'utilisateur

Une fonction scalaire Python définie par l'utilisateur intègre un programme Python qui s'exécute lorsque la fonction est appelée et renvoie une valeur unique. La commande CREATE FUNCTION définit les paramètres suivants :

  • (Facultatif) Arguments d'entrée. Chaque argument doit disposer d'un nom et d'un type de données.

  • Un type de données de retour.

  • Un programme Python exécutable.

Les types de données entrant et de retour peuvent être SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE ou TIMESTAMP. En outre, les fonctions Python définies par l'utilisateur peuvent utiliser le type de données ANYELEMENT, qu'Amazon Redshift convertit automatiquement en un type de données standard en fonction des arguments fournis lors de l'exécution. Pour plus d'informations, consultez Type de données ANYELEMENT

Lorsqu'une requête Amazon Redshift appelle une fonction UDF scalaire, les étapes suivantes se produisent au moment de l'exécution :

  1. La fonction convertit les arguments d'entrée en types de données Python.

    Pour un mappage des types de données Amazon Redshift avec les types de données Python, consultez Types de données de fonctions Python définies par l'utilisateur.

  2. La fonction exécute le programme Python, en transmettant les arguments d'entrée convertis.

  3. Le code Python renvoie une valeur unique. Le type de données de la valeur de retour doit correspondre au type de données RETURNS spécifié par la définition de fonction.

  4. La fonction convertit la valeur de retour Python dans le type de données Amazon Redshift, puis renvoie cette valeur à la requête.

Note

Python 3 n'est pas disponible pour les UDFs Python. Pour bénéficier de la prise en charge de Python 3 pour les UDFs Amazon Redshift, utilisez plutôt. Création d'une fonction scalaire Lambda définie par l'utilisateur

Exemple de fonction scalaire Python définie par l’utilisateur

L’exemple suivant crée une fonction qui compare deux nombres et renvoie la valeur la plus grande. Notez que la mise en retrait du code entre les signes de dollar doubles ($$) est une exigence Python. Pour plus d'informations, consultez CREATE FUNCTION.

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

La requête suivante appelle la nouvelle fonction f_greater pour interroger la table SALES et renvoyer COMMISSION ou 20 % du PRICEPAID, quelle que soit la valeur la plus grande.

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

Type de données ANYELEMENT

ANYELEMENT est un type de données polymorphe. Cela signifie que si une fonction est déclarée à l'aide de ANYELEMENT pour un type de données d'argument, la fonction peut accepter tous les types de données Amazon Redshift standard comme entrée pour cet argument lorsque la fonction est appelée. L'argument ANYELEMENT est défini sur le type de données qui lui est réellement transmis lorsque la fonction est appelée.

Si une fonction utilise plusieurs types de données ANYELEMENT, ils doivent tous être résolus au même type de données réel lorsque la fonction est appelée. Tous les types de données d'argument ANYELEMENT sont définies sur le type de données réel du premier argument transmis à un ANYELEMENT. Par exemple, une fonction déclarée comme f_equal(anyelement, anyelement) prendra les deux valeurs d'entrée, tant qu'elles sont du même type de données.

Si la valeur de retour d'une fonction est déclarée comme ANYELEMENT, au moins un argument d'entrée doit être ANYELEMENT. Le type de données réel de la valeur de retour est identique au type de données réel fourni pour l'argument d'entrée ANYELEMENT.