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
    $$;
Copy

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());
Copy

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)
    $$;
Copy

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');
Copy

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.)
    $$
  ;
Copy