Suporte a Python e Java para tarefas sem servidor¶
Tarefas sem servidor podem invocar os seguintes tipos de objeto e funções: funções definidas pelo usuário (UDFs) e procedimentos armazenados escritos em Python, Java e Scala.
Você pode usar Python ou Java em suas tarefas de algumas maneiras diferentes. Para entender a diferença entre essas opções, consulte Escolha se deseja escrever um procedimento armazenado ou uma função definida pelo usuário.
Funções definidas pelo usuário¶
Você pode criar UDFs para chamar a cláusula AS da sua tarefa. Você pode usar UDFs para executar operações não disponíveis em SQL. Para obter mais informações sobre UDFs, consulte Visão geral das funções definidas pelo usuário.
Os exemplos a seguir em Python e Java criam uma função que adiciona um ao valor de entrada.
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;
}
}';
Os exemplos a seguir criam my_task2
que adiciona um ao valor de retorno 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());
Procedimentos armazenados¶
Você pode criar procedimentos armazenados para chamar a cláusula AS da sua tarefa. Procedimentos armazenados geralmente realizam operações administrativas executando instruções SQL. Para obter mais informações sobre os procedimentos armazenados, consulte Visão geral dos procedimentos armazenados.
Os exemplos a seguir em Python e Java aceitam um nome de tabela e um nome de função para retornar uma tabela filtrada com linhas que correspondem à função especificada.
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;
}
}
$$;
Os exemplos a seguir criam task2
que chama o procedimento armazenado com a tabela retornada de task1 e a função 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');
Cláusula SQL AS¶
Você também pode definir o código Python ou Java diretamente na cláusula AS de definição de tarefa.
O exemplo a seguir usa Python para definir o valor de retorno de task2
como uma cadeia de caracteres.
CREATE OR REPLACE TASK IF NOT EXISTS task2
SCHEDULE = '1 minute'
AS
$$
print(Task completed successfully.)
$$
;