Prise en charge de Python et Java pour les tâches sans serveur

Les tâches sans serveur peuvent appeler les types d’objets et fonctions suivants : les fonctions définies par l’utilisateur (UDFs) et les procédures stockées écrites en Python, Java et Scala.

Vous pouvez utiliser Python ou Java dans vos tâches de différentes manières. Pour comprendre la différence entre ces options, voir Choisir d’écrire une procédure stockée ou une fonction définie par l’utilisateur.

Fonctions définies par l’utilisateur

Vous pouvez créer des UDFs pour appeler la clause AS de votre tâche. Vous pouvez utiliser des UDFs pour effectuer des opérations non disponibles dans SQL. Pour plus d’informations sur les UDFs, voir Vue d’ensemble des fonctions définies par l’utilisateur.

Les exemples suivants en Python et Java créent une fonction qui ajoute un à la valeur d’entrée.

CREATE OR REPLACE FUNCTION addone(i int)
  RETURNS int
  LANGUAGE python
  RUNTIME_VERSION = '3.8'
  HANDLER = 'addone_py'
  AS
    $$
    def addone_py(i):
      return i+1
    $$;
Copy

Les exemples suivants créent my_task2 qui ajoute un à la valeur de retour de my_task1.

CREATE OR REPLACE TASK IF NOT EXISTS my_task2
  AFTER my_task1
  AS
    SELECT addone(SYSTEM$GET_PREDECESSOR_RETURN_VALUE());
Copy

Procédures stockées

Vous pouvez créer des procédures stockées pour appeler la clause AS de votre tâche. Avec des procédures stockées, vous effectuez généralement des opérations administratives en exécutant des instructions SQL. Pour plus d’informations sur les procédures stockées, voir Vue d’ensemble des procédures stockées.

Les exemples suivants en Python et Java acceptent un nom de table et un nom de rôle pour renvoyer une table filtrée avec des lignes correspondant au rôle spécifié.

CREATE OR REPLACE PROCEDURE filterByRole(tableName VARCHAR, role VARCHAR)
  RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.8'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'filter_by_role'
  AS
    $$
    from snowflake.snowpark.functions import col

    def filter_by_role(session, table_name, role):
      df = session.table(table_name)
      return df.filter(col("role") == role)
    $$;
Copy

Les exemples suivants créent task2 qui appelle la procédure stockée avec la table renvoyée par task1 et le rôle de dev.

CREATE OR REPLACE TASK IF NOT EXISTS my_task2
  AFTER my_task1
  AS
    CALL filterByRole(SYSTEM$GET_PREDECESSOR_RETURN_VALUE(), 'dev');
Copy

Clause SQL AS

Vous pouvez également définir du code Python ou Java directement dans la clause AS de votre définition de tâche.

L’exemple suivant utilise Python pour définir la valeur de retour de task2 sur une chaîne.

CREATE OR REPLACE TASK IF NOT EXISTS task2
  SCHEDULE = '1 minute'
  AS
    $$
    print(Task completed successfully.)
    $$
  ;
Copy