Criação de procedimentos armazenados para DataFrames em Java

Usando o API Snowpark, você pode criar procedimentos armazenados para sua expressão lambda personalizada em Java. Você pode chamar esses procedimentos armazenados para processar os dados em DataFrame.

Você pode criar:

Criação de um procedimento armazenado temporário

Você pode criar um procedimento temporário que durará apenas a sessão atual. O procedimento temporário pode ser:

  • Um procedimento anônimo que você pode chamar por referência, por exemplo, passando uma variável do tipo com.snowflake.snowpark_java.StoredProcedure representando-o para o código que chama o procedimento.

  • Um procedimento nomeado com um nome atribuído por você. Você pode chamar o procedimento pelo nome de outro código na sessão.

Para criar um procedimento temporário, registre-o com um dos registerTemporary métodos de com.snowflake.snowpark_java.SProcRegistration. O método é sobrecarregado diversas vezes para suportar diferentes números de argumentos de procedimento. Para obter uma instância SProcRegistration, chame o método sproc da classe com.snowflake.snowpark_java.Session.

Ao chamar registerTemporary, você pode passar o seguinte como argumentos:

  • O nome do procedimento (quando for um procedimento nomeado).

  • O procedimento em si como uma expressão lambda.

  • Tipos de dados de parâmetro como uma classe única ou matriz de classe com.snowflake.snowpark_java.types.DataType. Omita esse argumento quando o procedimento que você está criando não tiver parâmetros.

    Estes devem corresponder aos tipos de parâmetros definidos no procedimento.

  • Retorne o tipo de dados como uma classe com.snowflake.snowpark_java.types.DataType.

Você pode chamar o procedimento com um método storedProcedure da classe com.snowflake.snowpark_java.Session.

Como criar um procedimento temporário anônimo

Para criar um procedimento temporário anônimo, registre-o como procedimento temporário sem especificar um nome. Snowflake criará um nome oculto para seu próprio uso.

O código no exemplo a seguir chama o método SProcRegistration.registerTemporary para criar um procedimento anônimo a partir de uma expressão lambda. O procedimento leva um objeto Session e um número inteiro como argumentos. O método registra um DataTypes.IntegerType como tipo de parâmetro único e um DataTypes.IntegerType como tipo de retorno.

O procedimento em si pegará um objeto Session e um número inteiro como argumentos. O argumento Session representa um parâmetro implícito que os chamadores não precisam passar como argumento.

Session session = Session.builder().configFile("my_config.properties").create();

StoredProcedure sp =
  session.sproc().registerTemporary(
    (Session spSession, Integer num) -> num + 1,
    DataTypes.IntegerType,
    DataTypes.IntegerType
  );
Copy

O código no exemplo a seguir chama o procedimento anônimo, passando a variável sp e 1 como seus argumentos. Observe que o objeto Session é um argumento implícito que você não precisa passar ao chamar o procedimento.

session.storedProcedure(sp, 1).show();
Copy

Criação de um procedimento temporário nomeado

Para criar um procedimento temporário nomeado, você o registra como procedimento temporário, passando seu nome como um dos argumentos.

O código no exemplo a seguir chama o método registerTemporary para criar um procedimento temporário nomeado chamado increment a partir de uma expressão lambda, passando o nome do procedimento como argumento. O método registra um DataTypes.IntegerType como tipo de parâmetro único e um DataTypes.IntegerType como tipo de retorno.

O procedimento em si pegará um objeto Session e um número inteiro como argumentos. O argumento Session representa um parâmetro implícito que os chamadores não precisam passar como argumento.

Session session = Session.builder().configFile("my_config.properties").create();

String procName = "increment";

StoredProcedure tempSP =
  session.sproc().registerTemporary(
    procName,
    (Session session, Integer num) -> num + 1,
    DataTypes.IntegerType,
    DataTypes.IntegerType
  );
Copy

O código no exemplo a seguir chama o procedimento increment, passando o nome do procedimento e 1 como seus argumentos. Observe que o objeto Session é um argumento implícito que você não precisa passar ao chamar o procedimento.

session.storedProcedure(procName, 1).show();
Copy

Criação de um procedimento armazenado permanente

Você pode criar um procedimento armazenado permanente que pode ser chamado de qualquer sessão, inclusive de uma planilha do Snowflake.

Para criar um procedimento permanente, registre-o com um método registerPermanent da classe com.snowflake.snowpark_java.SProcRegistration. O método é sobrecarregado diversas vezes para suportar diferentes números de argumentos de procedimento.

Ao chamar registerPermanent, você passa como argumentos o seguinte:

  • O nome do procedimento.

  • O procedimento em si como uma expressão lambda.

  • Tipos de dados de parâmetro como uma classe única ou matriz de classe com.snowflake.snowpark_java.types.DataType. Omita esse argumento quando o procedimento que você está criando não tiver parâmetros.

    Estes devem corresponder aos tipos de parâmetros definidos no procedimento.

  • O tipo de dados de retorno como uma classe com.snowflake.snowpark_java.types.DataType.

  • Um estágio existente para o qual o Snowflake deve copiar os arquivos resultantes da compilação do procedimento.

    Snowflake copiará todos os dados relacionados, incluindo dependências e funções lambda. Este deve ser um estágio permanente (não temporário da sessão) porque esse procedimento armazenado pode ser invocado fora da sessão atual. Se o procedimento for interrompido posteriormente, você deverá remover manualmente os arquivos relacionados do estágio.

  • Um valor booleano que indica se este procedimento deve ser executado com os direitos do chamador.

    Para saber mais sobre os direitos do chamador e os direitos do proprietário, consulte Understanding Caller’s Rights and Owner’s Rights Stored Procedures.

O código no exemplo a seguir chama o método registerPermanent para criar um procedimento permanente chamado add_hundred a partir de uma expressão lambda.

O método registra um DataTypes.IntegerType como tipo de parâmetro único e um DataTypes.IntegerType como tipo de retorno. Especifica um estágio chamado sproc_libs para o procedimento e suas dependências. Também especifica que o procedimento deve ser executado com os direitos do chamador.

O procedimento em si pegará um objeto Session e um número inteiro como argumentos. O argumento Session representa um parâmetro implícito que os chamadores não precisam passar como argumento.

Session session = Session.builder().configFile("my_config.properties").create();

String procName = "add_hundred";
String stageName = "sproc_libs";

StoredProcedure sp =
    session.sproc().registerPermanent(
        procName,
        (Session session, Integer num) -> num + 100,
        DataTypes.IntegerType,
        DataTypes.IntegerType,
        stageName,
        true
    );
Copy

O código no exemplo a seguir chama o procedimento add_hundred usando um método storedProcedure da classe com.snowflake.snowpark_java.Session. A chamada passa o nome do procedimento e 1 como seus argumentos. Observe que o objeto Session usado no manipulador como argumento é um argumento implícito que você não precisa passar ao chamar o procedimento.

session.storedProcedure(procName, 1).show();
Copy