Introdução a UDFs de Scala¶
Você pode escrever o manipulador para uma função definida pelo usuário (UDF) em Scala. Um manipulador é executado como a lógica da função quando é chamado em SQL.
O Snowflake atualmente oferece suporte para a escrita de UDFs nas seguintes versões de Scala:
2,12
Quando você tiver um manipulador, você criará a UDF com SQL. Para obter mais informações sobre como usar SQL para criar ou chamar uma UDF, consulte Criação de uma UDF ou Como chamar uma UDF.
Para uma introdução às UDFs, incluindo uma lista de linguagens na qual você pode escrever um manipulador de UDF, consulte Visão geral das funções definidas pelo usuário.
Nota
Para limitações relacionadas a manipuladores de Scala, consulte Limitações da UDF de Scala.
Você também pode usar o Scala para escrever uma UDF ao usar a API do Snowpark. Para obter mais informações, consulte Criação de funções definidas pelo usuário (UDFs) para DataFrames no Scala.
Como funciona um manipulador¶
Quando um usuário chama uma UDF, o usuário passa o nome e os argumentos da UDF para o Snowflake. O Snowflake chama o método do manipulador associado à UDF para executar a lógica da UDF. O método do manipulador então retorna a saída para o Snowflake, que a passa de volta para o cliente.
Para uma função escalar (que retorna um único valor), a UDF retorna um único valor para cada linha passada para a UDF.
Para oferecer suporte à lógica do seu manipulador, seu código pode fazer chamadas para bibliotecas externas ao manipulador. Por exemplo, se você já tiver um código de análise de dados em Scala, provavelmente poderá usá-lo em seu código de manipulador.
Para obter informações gerais sobre como escrever um manipulador em Scala, consulte Diretrizes de codificação do manipulador de UDF de Scala. Para obter mais informações sobre como escrever uma função escalar, consulte Como escrever uma UDF escalar em Scala.
Exemplo¶
O código no exemplo a seguir cria uma UDF chamada echo_varchar
com um método do manipulador TestFunc.echoVarchar
. O argumento Scala e os tipos de retorno são convertidos de e para SQL pelo Snowflake de acordo com os mapeamentos descritos em Mapeamentos de tipos de dados SQL-Scala.
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER='TestFunc.echoVarchar'
AS
$$
class TestFunc {
def echoVarchar(x : String): String = {
return x
}
}
$$;
Chamada da UDF¶
SELECT echo_varchar('Hello');
Considerações sobre o projeto¶
Tenha em mente o seguinte ao projetar um manipulador útil.
Considerações gerais. Para considerações comuns a UDFs e procedimentos, consulte Diretrizes de projeto e restrições para funções e procedimentos.
Como se manter dentro das restrições impostas pelo Snowflake. Para obter mais informações sobre a criação do código do manipulador que funciona bem no Snowflake, consulte Criação de manipuladores que ficam dentro das restrições impostas pelo Snowflake.
Mapeamento de tipo Scala-SQL. Ao trocar argumentos e retornar valores com uma UDF, Snowflake converte entre a linguagem do manipulador e SQL. Para obter mais informações sobre a escolha dos tipos de dados para seu código de manipulador, consulte Mapeamentos de tipos de dados SQL-Scala.
Empacotamento de código. Você pode disponibilizar seu código de manipulador em linha com a instrução CREATE FUNCTION ou em um estágio como código compilado em um JAR. Para obter mais informações sobre a diferença, consulte Como manter o código do manipulador inline ou em um estágio.
Para obter mais informações sobre como usar o sbt para empacotar o código compilado do seu manipulador Scala, consulte Empacotamento do código do manipulador Scala com sbt.
Otimização do código. Para obter mais informações sobre a otimização do código do manipulador, como quando o código lida com estado compartilhado entre linhas, consulte Controle do estado global em UDFs escalares em Scala.
Práticas recomendadas. Para obter mais informações sobre as práticas recomendadas, consulte Práticas recomendadas e Práticas de segurança para UDFs e procedimentos.
Codificação do manipulador¶
De exemplos básicos a detalhados, os seguintes tópicos descrevem como escrever um manipulador de UDF em Scala.
Diretrizes gerais. Para obter informações gerais sobre a codificação do manipulador, incluindo o tratamento de erros, a escolha de tipos de dados e muito mais, consulte Diretrizes de codificação do manipulador de UDF de Scala.
Como escrever uma função escalar Para obter mais informações, consulte Como escrever uma UDF escalar em Scala.
Registro em log e rastreamento de eventos. Para obter mais informações sobre a captura de dados de registro e rastreamento à medida que o código do manipulador é executado, consulte Visão geral do registro e do rastreamento.
Exemplos de códigos Para uma série de exemplos de manipuladores, consulte Exemplos de manipuladores de UDF em Scala.
Dependências. Você pode disponibilizar dependências para seu código no tempo de execução, carregando-as em um estágio. Para obter mais informações, consulte Disponibilização das dependências para seus códigos.
Organização de arquivos do manipulador. Se você pretende empacotar o código compilado do manipulador em um arquivo JAR para o estágio, organize e construa seu código usando as sugestões em Projeto e empacotamento do manipulador da UDF de Scala.