Visão geral das funções definidas pelo usuário

Você pode escrever funções definidas pelo usuário (UDFs) para estender o sistema para realizar operações que não estão disponíveis nas funções internas e definidas pelo sistema fornecidas pelo Snowflake. Quando uma UDF é criada, você pode reutilizá-la várias vezes. Uma função sempre retorna um valor explicitamente ao especificar uma expressão, portanto, é uma boa opção para calcular e retornar um valor.

É possível usar UDFs para estender funções internas ou encapsular cálculos padrão para sua organização. UDFs que você cria podem ser chamadas de forma semelhante às funções internas.

Você escreve a lógica de uma UDF– seu manipulador – em uma das linguagens suportadas. Depois de ter um manipulador, você pode criar uma UDF usando qualquer uma das várias ferramentas incluídas no Snowflake e, em seguida, executar a UDF.

Uma UDF é como um procedimento armazenado, mas os dois diferem de forma importante. Para obter mais informações, consulte Escolha se deseja escrever um procedimento armazenado ou uma função definida pelo usuário.

Uma UDF é apenas uma forma de estender o Snowflake. Para outras forma, veja o seguinte:

Variações de funções definidas pelo usuário

Você pode escrever uma UDF em uma das diversas variações, dependendo dos requisitos de entrada e saída que sua função deve atender.

Variação

Descrição

Função definida pelo usuário (UDF)

Também conhecida como função escalar, retorna uma linha de saída para cada linha de entrada. A linha retornada consiste em uma única coluna/valor.

Função agregada definida pelo usuário (UDAF)

Opera com valores em várias linhas para realizar cálculos matemáticos, como soma, média, contagem, localização de valores mínimos ou máximos, desvio padrão e estimativa, bem como algumas operações não matemáticas.

Função de tabela definida pelo usuário (UDTF)

Retorna um valor tabular para cada linha de entrada.

Função vetorizada definida pelo usuário (UDF)

Receba lotes de linhas de entrada como Pandas DataFrames e retorne lotes de resultados como Pandas arrays ou Series.

Função de tabela vetorizada definida pelo usuário (UDTF)

Receba lotes de linhas de entrada como Pandas DataFrames e retorne resultados tabulares.

Linguagens e ferramentas compatíveis

Você pode criar e gerenciar UDFs (e outras entidades do Snowflake) usando qualquer uma das várias ferramentas, dependendo de como prefere trabalhar.

Linguagem

Abordagem

Suporte

SQL

Com o manipulador em Java, JavaScript, Python, Scala ou SQL

Escreva o código SQL no Snowflake para criar e gerenciar entidades do Snowflake. Escreva a lógica da função em uma das linguagens de manipulador compatíveis.

Java:

UDF, UDTF

JavaScript:

UDF, UDTF

Python:

UDF, UDAF, UDTF, UDF vetorizada, UDTF vetorizada

Scala:

UDF

SQL:

UDF, UDTF

Java, Python ou Scala

Snowpark API

No cliente, escreva o código das operações que são enviadas ao Snowflake para processamento.

Java:

UDF, UDTF

Python:

UDF, UDAF, UDTF, UDF ou UDTF vetorizada

Scala:

UDF, UDTF

Interface de linha de comando

Snowflake CLI

Use a linha de comando para criar e gerenciar entidades Snowflake, especificando propriedades como propriedades de objetos JSON.

Gerenciamento de objetos Snowflake

Python

Snowflake Python API

No cliente, execute comandos para criar a função com Python, escrevendo o manipulador da função em uma das linguagens de manipulador compatíveis.

Gerenciamento de funções definidas pelo usuário (UDFs)

REST

Snowflake REST API

Faça solicitações de pontos de extremidade RESTful para criar e gerenciar entidades Snowflake.

Gerenciamento de funções definidas pelo usuário

Ao escolher uma linguagem, considere também o seguinte:

  • Locais do manipulador com suporte. Nem todas as linguagens oferecem suporte à referência ao manipulador em um estágio (o código do manipulador deve ser em linha em vez disso). Para obter mais informações, consulte Como manter o código do manipulador em linha ou em um estágio.

  • Se o manipulador resultar em uma UDF que é compartilhável. Uma UDF compartilhável pode ser usada com o recurso Secure Data Sharing do Snowflake.

Linguagem

Localização do manipulador

Compartilhável

Java

Inline ou no estágio

Não [1]

JavaScript

Inline

Sim

Python

Inline ou no estágio

Não [2]

Scala

Inline ou no estágio

Não [3]

SQL

Inline

Sim

Considerações

  • Se uma consulta chamar uma UDF para acessar arquivos preparados, a operação falhará com um erro do usuário se a instrução SQL também consultar uma exibição que chame qualquer UDF ou UDTF, não importando se a função na exibição acessa arquivos preparados ou não.

  • UDTFs podem processar vários arquivos paralelamente; entretanto, UDFs atualmente processam arquivos em série. Para contornar isso, agrupe linhas em uma subconsulta usando a cláusula GROUP BY. Para obter um exemplo, consulte Processamento de um CSV com uma UDTF.

  • Atualmente, se os arquivos preparados referenciados em uma consulta forem modificados ou excluídos enquanto a consulta estiver em execução, a chamada de função falhará com um erro.

  • Se você especificar a função CURRENT_DATABASE ou CURRENT_SCHEMA no código do manipulador da UDF, a função retornará o banco de dados ou esquema que contém a UDF, não o banco de dados ou esquema em uso para a sessão.

Exemplo de UDF

O código no exemplo a seguir cria uma UDF chamada addone com um manipulador escrito em Python. A função do manipulador é addone_py. Esta UDF retorna um int.

CREATE OR REPLACE FUNCTION addone(i int)
RETURNS INT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
HANDLER = 'addone_py'
as
$$
def addone_py(i):
 return i+1
$$;
Copy

O código no exemplo a seguir executa a UDF addone.

SELECT addone(3);
Copy

Diretrizes e restrições

Restrições do Snowflake:

Você pode garantir a estabilidade dentro do ambiente Snowflake desenvolvendo dentro das restrições do Snowflake. Para obter mais informações, consulte Criação de manipuladores que ficam dentro das restrições impostas pelo Snowflake.

Nomeação:

Certifique-se de nomear as funções de forma a evitar colisões com outras funções. Para obter mais informações, consulte Como nomear e sobrecarregar procedimentos e UDFs.

Argumentos:

Especifique os argumentos e indique quais argumentos são opcionais. Para obter mais informações, consulte Definição de argumentos para UDFs e procedimentos armazenados.

Mapeamentos de tipos de dados:

Para cada linguagem do manipulador, há um conjunto separado de mapeamentos entre os tipos de dados da linguagem e os tipos SQL usados para valores de retorno e argumentos. Para saber mais sobre os mapeamentos para cada linguagem, consulte Mapeamentos de tipos de dados entre linguagens do manipulador e SQL.

Como escrever o manipulador

Linguagens do manipulador:

Para obter conteúdo específico da linguagem ao escrever um manipulador, consulte Linguagens e ferramentas compatíveis.

Acesso à rede externa:

Você pode acessar locais de rede externos com acesso à rede externa. Você pode criar acesso seguro a locais de rede específicos externos ao Snowflake e usar esse acesso de dentro do código do manipulador.

Registro, rastreamento e métricas:

É possível registrar a atividade do código capturando mensagens de log, eventos de rastreamento e dados de métricas, armazenando os dados em um banco de dados que pode ser consultado posteriormente.

Segurança

Você pode conceder privilégios nos objetos necessários para que realizem ações SQL específicas com uma UDF ou UDTF. Para obter mais informações, consulte Concessão de privilégios para funções definidas pelo usuário

As funções têm certas preocupações de segurança como os procedimentos armazenados. Para obter mais informações, consulte o seguinte:

Implementação do código do manipulador

Ao criar uma função, você pode especificar seu manipulador - que implementa a lógica da função - como código em linha com a definição da função ou como código externo à definição, como código empacotado e copiado para um estágio.

Para obter mais informações, consulte Como manter o código do manipulador em linha ou em um estágio.