Introdução a UDFs de Java¶
Este tópico introduz UDFs de Java e fornece informações para ajudá-lo a decidir quando usar uma UDF de Java.
Neste tópico:
O que é um UDF de Java?¶
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 Java.
Para cada linha passada para uma UDF de Java, a UDF retorna um valor escalar (ou seja, único) ou, se definida como uma função de tabela, um conjunto de linhas.
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 Java, o Snowflake chama o código de Java adequado (chamado método do manipulador) em um arquivo JAR. O método do manipulador então retorna a saída para o Snowflake, que a passa de volta para o cliente. Abaixo está uma ilustração simplificada do fluxo de dados:

UDFs de Java 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 Java, você provavelmente pode incorporá-lo em uma UDF de Java.
O Snowflake atualmente oferece suporte para a escrita de UDFs de Java nas seguintes versões de Java:
11.x
Quando usar uma UDF de Java¶
Esta seção descreve as vantagens e limitações de UDFs de Java.
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 Java¶
UDFs de Java são particularmente adequadas quando um ou mais dos seguintes pontos são verdadeiros:
Você já tem um código de Java (código-fonte ou compilado) que pode usar.
Seu código usa (ou poderia usar) funções que já existem em bibliotecas de Java padrão.
Você conhece Java tão bem ou melhor do que as outras linguagens que oferecem suporte para UDFs.
Limitações de UDFs de Java¶
Limitações gerais¶
Embora seu método de Java possa usar classes e métodos nas bibliotecas padrão de Java, as limitações de segurança do Snowflake desabilitam algumas capacidades, tais como escrever em arquivos. Para obter mais detalhes, consulte a seção intitulada Boas práticas de segurança.
UDFs de Java não são compartilháveis. Objetos de banco de dados que usam UDFs de Java também não são compartilháveis. Por exemplo, você não pode:
Compartilhar diretamente uma UDF de Java.
Compartilhar uma exibição que chama uma UDF de Java.
Compartilhar uma função que chama uma UDF de Java.
Compartilhar uma tabela com uma política de acesso a linhas ou de mascaramento que chame uma UDF de Java.
A concessão de um privilégio de USAGE para uma UDF de Java 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 Java a uma função, e se essa função executar uma instrução que chama essa UDF de Java, qualquer UDF de Java na mesma instrução poderá ler o conteúdo de qualquer arquivo importado pela UDF de Java para a qual você concedeu o privilégio de USAGE.
A replicação de banco de dados ainda não inclui estágios externos ou internos. Quando você promove um banco de dados secundário para servir como banco de dados primário, você deve recriar objetos de preparação e reimportar quaisquer arquivos que faltem em estágios internos. Os arquivos devem ter o mesmo caminho e os mesmos nomes que no banco de dados primário original.
O tamanho máximo para uma linha de saída de uma UDF de Java é 16 MB.
Limitações da clonagem¶
Uma UDF de Java pode ser clonada quando o banco de dados ou esquema contendo a UDF de Java é clonado. Para ser clonada, a UDF de Java deve satisfazer a(s) seguinte(s) condição(ões):
Se a UDF de Java faz referência a um estágio (por exemplo, o estágio que contém o arquivo JAR da UDF), esse estágio deve estar fora do esquema (ou banco de dados) que está sendo clonado.
Você pode manter uma UDF de Java 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 Java 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 Java. 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 Java 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 Java 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 Java não conformes serão omitidas do clone sem nenhuma mensagem de erro ou advertência.
Cada UDF de Java 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 Java 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 (por exemplo, substituir o arquivo JAR por um arquivo JAR mais recente) afeta tanto a UDF original quanto a clonada.