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 |
---|---|---|
|
Formatos de URL:
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. |
|
Formatos de URL:
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);
}
}
$$;
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'));
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);
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;
}
}
$$;
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'));