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, Python ou Scala |
No cliente, escreva o código das operações que são enviadas ao Snowflake para processamento. |
|
Interface de linha de comando |
Use a linha de comando para criar e gerenciar entidades Snowflake, especificando propriedades como propriedades de objetos JSON. |
|
Python |
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. |
|
REST |
Faça solicitações de pontos de extremidade RESTful para criar e gerenciar entidades Snowflake. |
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
$$;
O código no exemplo a seguir executa a UDF addone
.
SELECT addone(3);
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:
Você pode ajudar o código do manipulador de um procedimento a ser executado com segurança, seguindo as práticas recomendadas descritas em Práticas de segurança para UDFs e procedimentos
Certifique-se de que as informações sensíveis sejam ocultadas dos usuários que não deveriam ter acesso a elas. Para obter mais informações, consulte Proteção de informações sensíveis com UDFs e procedimentos armazenados seguros
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.