Leitura de arquivos com um procedimento armazenado em Java

Você pode ler o conteúdo de um arquivo com o código do manipulador. O arquivo deve estar em um estágio do Snowflake que esteja disponível para seu manipulador. Por exemplo, você pode querer ler um arquivo para processar dados não estruturados no manipulador.

Para ler o conteúdo dos arquivos preparados, seu manipulador pode chamar métodos na classe SnowflakeFile ou na classe InputStream. Você pode fazer isso se precisar acessar o arquivo de forma dinâmica durante a computação Para obter mais informações, consulte Como ler um arquivo especificado dinamicamente com SnowflakeFile ou Como ler um arquivo especificado dinamicamente com InputStream neste tópico.

SnowflakeFile fornece recursos não disponíveis com InputStream, conforme descrito na tabela a seguir.

Classe

Entrada

Notas

SnowflakeFile

Formatos de URL:

  • URL com escopo para reduzir o risco de ataques de injeção de arquivo quando o chamador da função não for também seu proprietário.

  • URL do arquivo ou caminho da cadeia de caracteres para arquivos aos quais o proprietário do procedimento tem acesso.

O arquivo deve estar localizado em um estágio interno ou em um estágio externo nomeado.

Acesso fácil a atributos adicionais do arquivo, como o tamanho do arquivo.

InputStream

Formatos de URL:

  • URL com escopo para reduzir o risco de ataques de injeção de arquivo quando o chamador da função não for também seu proprietário.

O arquivo deve estar localizado em um estágio interno ou em um estágio externo nomeado.

Como ler um arquivo especificado dinamicamente com SnowflakeFile

O código no exemplo a seguir tem uma função de manipulador execute que obtém um String e retorna um String com o conteúdo do arquivo. No tempo de execução, Snowflake inicializa a variável do manipulador fileName do caminho do arquivo de entrada na variável do procedimento input. O código do manipulador usa uma instância SnowflakeFile para ler o arquivo.

CREATE OR REPLACE PROCEDURE file_reader_java_proc_snowflakefile(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark_java.types.SnowflakeFile;
import com.snowflake.snowpark_java.Session;

class FileReader {
  public String execute(Session session, String fileName) throws IOException {
    InputStream input = SnowflakeFile.newInstance(fileName).getInputStream();
    return new String(input.readAllBytes(), StandardCharsets.UTF_8);
  }
}
$$;
Copy

O código no exemplo de CALL a seguir cria um URL de arquivo com escopo que aponta para o arquivo. Este é um URL codificado que permite o acesso temporário a um arquivo preparado sem conceder privilégios ao próprio estágio.

CALL file_reader_java_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy

Nota

Para um procedimento armazenado de direitos do proprietário, o proprietário do procedimento deve ter acesso a todos os arquivos que não são URLs com escopo. Para os procedimentos de direitos do chamador, o chamador deve ter acesso a todos os arquivos que não são URLs com escopo. Em ambos os casos, você pode ler o arquivo preparado fazendo com que o código do manipulador chame o método SnowflakeFile.newInstance com um valor boolean para um novo parâmetro requireScopedUrl.

O exemplo a seguir usa SnowflakeFile.newInstance ao especificar que um URL com escopo não é necessário.

String filename = "@my_stage/filename.txt";
String sfFile = SnowflakeFile.newInstance(filename, false);
Copy

Como ler um arquivo especificado dinamicamente com InputStream

O código no exemplo a seguir tem uma função de manipulador execute que obtém um InputStream e retorna um String com o conteúdo do arquivo. No tempo de execução, Snowflake inicializa a variável do manipulador stream do caminho do arquivo de entrada na variável do argumento input. O código do manipulador usa o InputStream para ler o arquivo.

CREATE OR REPLACE PROCEDURE file_reader_java_proc_input(input VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = 11
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.snowflake.snowpark.Session;

class FileReader {
  public String execute(Session session, InputStream stream) throws IOException {
    String contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8);
    return contents;
  }
}
$$;
Copy

O código no exemplo de CALL a seguir cria um URL de arquivo com escopo que aponta para o arquivo. Este é um URL codificado que permite o acesso temporário a um arquivo preparado sem conceder privilégios ao próprio estágio.

CALL file_reader_java_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy