Lire les fichiers à l’aide d’une procédure stockée Java¶
Vous pouvez lire le contenu d’un fichier avec le code du gestionnaire. Le fichier doit se trouver sur une zone de préparation Snowflake qui est disponible pour votre gestionnaire. Par exemple, vous pourriez vouloir lire un fichier pour traiter des données non structurées dans le gestionnaire.
Pour lire le contenu des fichiers en zone de préparation, votre gestionnaire peut appeler des méthodes de la classe SnowflakeFile
ou de la classe InputStream
. Vous pouvez le faire si vous avez besoin d’accéder au fichier de manière dynamique pendant le calcul. Pour plus d’informations, voir Lecture d’un fichier spécifié de façon dynamique avec SnowflakeFile ou Lecture d’un fichier spécifié de façon dynamique avec InputStream dans cette rubrique.
SnowflakeFile
offre des fonctionnalités non disponibles avec InputStream
, comme décrit dans le tableau suivant.
Classe |
Entrée |
Remarques |
---|---|---|
|
Formats d’URL :
Le fichier doit être situé dans une zone de préparation interne ou externe nommée. |
Accédez facilement à des attributs de fichier supplémentaires, tels que la taille du fichier. |
|
Formats d’URL :
Le fichier doit être situé dans une zone de préparation interne ou externe nommée. |
Lecture d’un fichier spécifié de façon dynamique avec SnowflakeFile
¶
Le code de l’exemple suivant comporte une fonction de gestionnaire execute
qui prend un String
et renvoie un String
avec le contenu du fichier. Au moment de l’exécution, Snowflake initialise la variable fileName
du gestionnaire à partir du chemin du fichier entrant dans la variable input
de la procédure. Le code du gestionnaire utilise une instance SnowflakeFile
pour lire le fichier.
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);
}
}
$$;
Le code de l’exemple CALL suivant crée une URL de fichier scopée qui pointe vers le fichier. Il s’agit d’une URL encodée qui permet un accès temporaire à un fichier en zone de préparation sans accorder de privilèges à la zone de préparation en soi.
CALL file_reader_java_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Note
Pour une procédure stockée avec droits du propriétaire, le propriétaire de la procédure doit avoir accès à tous les fichiers qui ne sont pas des URLs scopées. Pour les procédures de droits de l’appelant, l’appelant doit avoir accès à tous les fichiers qui ne sont pas des URLs scopées. Dans les deux cas, vous pouvez lire le fichier en zone de préparation en demandant au code du gestionnaire d’appeler la méthode SnowflakeFile.newInstance
avec une valeur boolean
pour un nouveau paramètre requireScopedUrl
.
L’exemple suivant utilise SnowflakeFile.newInstance
tout en spécifiant qu’une URL scopée n’est pas nécessaire.
String filename = "@my_stage/filename.txt";
String sfFile = SnowflakeFile.newInstance(filename, false);
Lecture d’un fichier spécifié de façon dynamique avec InputStream
¶
Le code de l’exemple suivant comporte une fonction de gestionnaire execute
qui prend un InputStream
et renvoie un String
avec le contenu du fichier. Au moment de l’exécution, Snowflake initialise la variable stream
du gestionnaire à partir du chemin du fichier entrant dans l’argument input
de la procédure. Le code du gestionnaire utilise le InputStream
pour lire le fichier.
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;
}
}
$$;
Le code de l’exemple CALL suivant crée une URL de fichier scopée qui pointe vers le fichier. Il s’agit d’une URL encodée qui permet un accès temporaire à un fichier en zone de préparation sans accorder de privilèges à la zone de préparation en soi.
CALL file_reader_java_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));