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
$$;
CREATE OR REPLACE FUNCTION add_one(i int)
RETURNS int
LANGUAGE java
CALLED ON NULL INPUT
HANDLER = 'TestFunc.addOne'
TARGET_PATH = '@~/testfunc.jar'
AS
'class TestFunc {
public static int addOne(int i) {
return i+1;
}
}';
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());
CREATE OR REPLACE TASK IF NOT EXISTS my_task2
AFTER my_task1
AS
SELECT add_one(SYSTEM$GET_PREDECESSOR_RETURN_VALUE());
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)
$$;
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'FilterClass.filterByRole'
AS
$$
import com.snowflake.snowpark_java.*;
public class FilterClass {
public DataFrame filterByRole(Session session, String tableName, String role) {
DataFrame table = session.table(tableName);
DataFrame filteredRows = table.filter(Functions.col("role").equal_to(Functions.lit(role)));
return filteredRows;
}
}
$$;
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');
CREATE OR REPLACE TASK IF NOT EXISTS my_task2
AFTER my_task1
AS
CALL filter_by_role(SYSTEM$GET_PREDECESSOR_RETURN_VALUE(), 'dev');
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.)
$$
;