Como escrever manipuladores Scala para procedimentos armazenados criados com SQL¶
Você pode criar um procedimento armazenado cujo manipulador é escrito em Scala. Você pode usar a biblioteca do Snowpark dentro do seu procedimento armazenado para realizar consultas, atualizações e outros trabalhos em tabelas no Snowflake.
Com os procedimentos armazenados do, você pode construir e executar seu pipeline de dados dentro do Snowflake, usando um warehouse do Snowflake como estrutura computacional. Para o código do seu pipeline de dados, você usa a API do Snowpark para Scala para escrever procedimentos armazenados. Para programar a execução desses procedimentos armazenados, você usa tarefas.
É possível capturar dados de registro e rastreamento à medida que o código do manipulador é executado. Para obter mais informações, consulte Registro, rastreamento e métricas.
Como escrever um manipulador Scala para um procedimento armazenado¶
Certifique-se de que seu ambiente atenda aos pré-requisitos.
Se você estiver desenvolvendo localmente, configure seu ambiente para usar o Snowpark.
Escolha se deseja implantar seu manipulador em linha ou em um estágio.
Siga as diretrizes para a classe ou objeto, método ou função e performance do manipulador.
Implemente suporte para recursos como acesso a dados, leitura de arquivos, retorno de dados tabulares e registro e rastreamento.
Disponibilize as dependências do seu código no Snowflake.
Inclua o código do manipulador em linha ou importado de um estágio quando você criar o procedimento armazenado.
Nota
Para criar e chamar um procedimento anônimo, use CALL (com procedimento anônimo). Criar e chamar um procedimento anônimo não exige uma função com privilégios de esquema CREATE PROCEDURE.
Como atender aos pré-requisitos¶
Você deve usar a versão 1.1.0 ou uma versão mais recente da biblioteca do Snowpark.
Se você estiver escrevendo um procedimento armazenado cujo código do manipulador será copiado em um estágio você deverá compilar suas classes para executar na versão Java 11.x.
Configuração de seu ambiente de desenvolvimento para o Snowpark¶
Se estiver desenvolvendo seu código localmente, configure seu ambiente de desenvolvimento para usar a biblioteca Snowpark. Consulte Configuração do seu ambiente de desenvolvimento para o Snowpark Scala.
Como estruturar e criar um código do manipulador¶
Você pode manter o código fonte do manipulador em linha com o SQL que cria o procedimento ou manter o resultado do manipulador compilado em um local separado e referenciá-lo a partir do SQL. Para obter mais informações, consulte Como manter o código do manipulador em linha ou em um estágio.
Para saber mais sobre como criar o código-fonte do manipulador para uso com um procedimento, consulte Empacotamento do código do manipulador.
Diretrizes para a classe ou o objeto do manipulador¶
Ao escrever a classe ou o objeto do manipulador, observe o seguinte:
A classe (ou objeto) e o método não devem ser protegidos ou privados.
Se o método não for estático e você quiser definir um construtor, defina um construtor sem argumentos para a classe. O Snowflake ativa esse construtor sem argumentos no momento da inicialização para criar uma instância da sua classe.
Você pode definir diferentes métodos para diferentes procedimentos armazenados na mesma classe ou objeto.
Diretrizes para o método ou função do manipulador¶
Ao escrever o método ou a função para um procedimento armazenado, observe o seguinte:
Especifique o objeto
Session
Snowpark como o primeiro argumento de seu método ou função.Quando você chama seu procedimento armazenado, o Snowflake cria automaticamente um objeto
Session
e o passa para seu procedimento armazenado. (Você, por si só, não pode criar o objetoSession
).Para o restante dos argumentos e para o valor de retorno, use os tipos Scala que correspondem aos tipos de dados Snowflake.
Seu método ou função deve retornar um valor.
A execução do procedimento armazenado expira a menos que o cronômetro seja reiniciado pela atividade do código. Em particular, o temporizador de tempo limite é redefinido pelas interações do código com os dados, incluindo operações de arquivo, consultas e iteração por meio de um conjunto de resultados.
Quando você executa um trabalho filho assíncrono de dentro do manipulador de um procedimento, “disparar e esquecer” não é suportado.
Em outras palavras, se o manipulador emitir uma consulta filha que ainda esteja em execução quando o trabalho do procedimento pai for concluído, o trabalho filho será cancelado automaticamente.
Diretrizes para o desempenho e a segurança do manipulador¶
Para garantir que seu código seja executado corretamente no Snowflake, siga estas diretrizes:
Limite a quantidade de memória consumida
O Snowflake impõe limites em um método em termos da quantidade de memória necessária. Para obter mais informações sobre como evitar o consumo excessivo, consulte Criação de manipuladores que ficam dentro das restrições impostas pelo Snowflake.
Escreva o código thread-safe.
Certifique-se de que o método ou função do seu manipulador seja thread-safe.
Entenda as restrições de segurança.
O código de seu manipulador funciona dentro de um mecanismo restrito, portanto, certifique-se de seguir as regras descritas em Práticas de segurança para UDFs e procedimentos.
Decida sobre o uso dos direitos do proprietário ou dos direitos do chamador.
Ao planejar escrever seu procedimento armazenado, considere se deseja que o procedimento armazenado seja executado com direitos do chamador ou direitos do proprietário.
Lembre-se do comportamento de tempo limite para procedimentos armazenados.
A execução do procedimento armazenado expira a menos que o cronômetro seja reiniciado pela atividade do código. Em particular, o temporizador de tempo limite é redefinido pelas interações do código com os dados, incluindo operações de arquivo, consultas e iteração por meio de um conjunto de resultados.
Disponibilização das dependências para seu código¶
Se seu código de manipulador depender do código definido fora do próprio manipulador (como classes em um arquivo JAR) ou de arquivos de recursos, você pode disponibilizar essas dependências para seu código, carregando-os em um estágio. Ao criar o procedimento, você pode referenciar estas dependências usando a cláusula IMPORTS.
Para obter mais informações, consulte Disponibilização das dependências para seus códigos.