Introdução a UDFs de Python¶
Este tópico introduz UDFs de Python e fornece informações para ajudá-lo a decidir quando usar uma UDF de Python.
Neste tópico:
O que é uma UDF de Python?¶
Uma UDF (função definida pelo usuário) é uma função escrita pelo usuário que pode ser chamada a partir do Snowflake da mesma forma que uma função interna pode ser chamada.
O Snowflake oferece suporte para UDFs escritas em várias linguagens, incluindo Python.
UDFs de Python são funções escalares; para cada linha passada para a UDF, a UDF retorna um valor.
UDFs aceitam 0 ou mais parâmetros.
Quando um usuário chama uma UDF, o usuário passa o nome da UDF e os parâmetros da UDF para o Snowflake. Se a UDF for uma UDF de Python, o Snowflake chama o código de Python adequado (chamado função do manipulador). A função do manipulador retorna então a saída ao Snowflake, que a repassa ao cliente.
UDFs de Python podem conter tanto código novo como chamadas para bibliotecas existentes, permitindo flexibilidade e reutilização do código. Por exemplo, se você já tem um código de análise de dados em Python, você provavelmente pode incorporá-lo em uma UDF de Python.
Atualmente, o Snowflake oferece suporte para a escrita de UDFs na versão de Python 3.8.
Através de uma parceria com o Anaconda, pacotes de terceiros de Python são fornecidos pelo Snowflake. Para saber mais, consulte Como usar pacotes de terceiros.
Nota
Há uma API de lote de UDF de Python que permite definir funções de Python que recebem lotes de linhas de entrada como DataFrames do Pandas e retornam lotes de resultados como Arrays ou Series do Pandas. Para obter mais informações, consulte API de lote de UDF de Python.
Quando usar uma UDF de Python¶
Para obter mais informações sobre outras linguagens em potencial nas quais escrever UDFs e comparações entre essas linguagens, consulte Visão geral de UDFs.
Para obter mais informações sobre outras formas de estender o Snowflake, consulte:
Vantagens de UDFs de Python¶
UDFs de Python são particularmente adequadas quando um ou mais dos seguintes pontos são verdadeiros:
Você já tem um código de Python (código-fonte ou compilado) que pode usar.
Seu código usa (ou poderia usar) funções que já existem em pacotes de Python padrão.
Você conhece Python tão bem ou melhor do que as outras linguagens que oferecem suporte para UDFs.
Você quer tirar proveito do rico ecossistema de terceiros do Python.
Limitações de UDFs de Python¶
Limitações gerais¶
Embora sua função de Python possa usar módulos e funções nos pacotes padrão de Python, as limitações de segurança do Snowflake desabilitam algumas capacidades, tais como o acesso a redes e a escrita em arquivos. Para obter mais detalhes, consulte a seção intitulada Boas práticas de segurança.
Todas as UDFs e módulos trazidos por estágios devem ser independentes da plataforma e não devem conter extensões nativas.
Evite códigos que suponham uma arquitetura de CPU específica (por exemplo, x86).
Evite códigos que suponham um sistema operacional específico.
UDFs de Python não são compartilháveis. Objetos de banco de dados que usam UDFs de Python também não são compartilháveis. Por exemplo, você não pode:
Compartilhar diretamente uma UDF de Python.
Compartilhar uma exibição que chama uma UDF de Python.
Compartilhar uma função que chama uma UDF de Python.
Compartilhar uma tabela com uma política de acesso a linhas ou de mascaramento que chame uma UDF de Python.
A concessão de um privilégio de USAGE para uma UDF de Python pode permitir que o destinatário veja o conteúdo dos arquivos importados por essa UDF. Se você conceder o privilégio de USAGE para uma UDF de Python a uma função, e se essa função executar uma instrução que chama essa UDF de Python, qualquer UDF de Python na mesma instrução poderá ler o conteúdo de qualquer arquivo importado pela UDF de Python para a qual você concedeu o privilégio de USAGE.
A replicação de banco de dados é suportada para UDFs de Python inline. No entanto, a replicação é bloqueada se um UDF de Python tiver uma dependência de um arquivo em um estágio (ou seja, uma função criada usando a cláusula IMPORTS). Essa limitação pode ser removida em versões futuras.
O Snowflake usa o módulo de Python
zipimport
para importar o código de Python de estágios. Como resultado, quaisquer limitações dozipimport
também estarão presentes com UDFs. Para saber mais sobrezipimport
, consulte a referência zipimport.
Limitações da clonagem¶
Uma UDF de Python pode ser clonada quando o banco de dados ou esquema contendo a UDF de Python é clonado. Para ser clonada, a UDF de Python deve satisfazer a(s) seguinte(s) condição(ões):
Se a UDF de Java faz referência a um estágio, esse estágio deve estar fora do esquema (ou banco de dados) que está sendo clonado.
Você pode manter uma UDF de Python e seu(s) estágio(s) referenciado(s) em esquemas separados (e/ou bancos de dados separados) das seguintes maneiras:
Sempre que a UDF de Python fizer referência a um estágio, use um nome de estágio qualificado (por exemplo “my_db.my_schema.my_stage()”) diferente do esquema ou banco de dados da UDF de Python. Se a operação de clonagem clona um banco de dados, a referência do estágio deve incluir o banco de dados e o esquema. Se a operação de clonagem clonar um esquema, a referência do estágio deve incluir o esquema (e opcionalmente o banco de dados).
Crie o estágio referenciado usando um nome de estágio não qualificado (que implicitamente usa o banco de dados e esquema ativo da sessão atual) e crie a UDF de Python usando um nome qualificado que não corresponda ao banco de dados e esquema atual da sessão.
Use o estágio do usuário como o estágio referenciado (o estágio do usuário é separado de qualquer estágio ou esquema de banco de dados).
Se uma ou mais UDFs de Python no esquema ou banco de dados não satisfizerem as condições exigidas, o esquema ou banco de dados ainda poderá ser clonado, mas as UDFs de Python não conformes serão omitidas do clone sem nenhuma mensagem de erro ou advertência.
Cada UDF de Python clonada tem a mesma definição que a original. Essa definição inclui quaisquer referências a estágios. As referências a estágios na UDF de Python devem ser totalmente qualificadas e, portanto, são absolutas, não relativas ao esquema ou banco de dados que está sendo clonado. Porque tanto o original quanto o clone apontam para o(s) mesmo(s) estágio(s) e arquivo(s):
Remover o estágio ou remover arquivos necessários do estágio desativa tanto a UDF original quanto a clonada.
Alterar o estágio ou os arquivos no palco afeta tanto a UDF original quanto a clonada.