Écrire des gestionnaires Scala pour les procédures stockées créées à l’aide de SQL¶
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. |
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.
var filename = "@my_stage/filename.txt"
var sfFile = SnowflakeFile.newInstance(filename, false)
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_scala_proc_snowflakefile(input VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream
import java.nio.charset.StandardCharsets
import com.snowflake.snowpark_java.types.SnowflakeFile
import com.snowflake.snowpark_java.Session
object FileReader {
def execute(session: Session, fileName: String): String = {
var input: InputStream = 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_scala_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Lecture d’un fichier spécifié de façon dynamique avec InputStream
¶
Le code de l’exemple suivant définit une fonction du 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 la variable input
de la procédure. Le code du gestionnaire utilise le InputStream
pour lire le fichier.
CREATE OR REPLACE PROCEDURE file_reader_scala_proc_input(input VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER = 'FileReader.execute'
PACKAGES=('com.snowflake:snowpark:latest')
AS $$
import java.io.InputStream
import java.nio.charset.StandardCharsets
import com.snowflake.snowpark_java.Session
object FileReader {
def execute(session: Session, stream: InputStream): String = {
val contents = new String(stream.readAllBytes(), StandardCharsets.UTF_8)
return contents
}
}
$$;
Le code de l’exemple CALL suivant crée une URL de fichier de champ d’application codé qui pointe vers le fichier. Une URL encodée permet un accès temporaire à un fichier en zone de préparation sans accorder de privilèges à la zone de zone de préparation elle-même.
CALL file_reader_scala_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));