Lesen von Dateien mit einer in Java gespeicherten Prozedur¶
Sie können den Inhalt einer Datei mit Handler-Code lesen. Die Datei muss sich in einem Snowflake-Stagingbereich befinden, auf den Ihr Handler zugreifen kann. Sie könnten zum Beispiel eine Datei lesen, um unstrukturierte Daten im Handler zu verarbeiten.
Um den Inhalt von Stagingdateien zu lesen, kann Ihr Handler Methoden entweder der Klasse SnowflakeFile
oder der Klasse InputStream
aufrufen: Diese Vorgehensweise kann verwendet werden, wenn Sie während der Verarbeitung dynamisch auf die Datei zugreifen müssen. Weitere Informationen dazu finden Sie unter Lesen einer mit SnowflakeFile dynamisch spezifizierten Datei oder Lesen einer mit InputStream dynamisch spezifizierten Datei (unter diesem Thema).
SnowflakeFile
bietet Features, die bei InputStream
nicht verfügbar sind, wie in der folgenden Tabelle beschrieben.
Klasse |
Eingabe |
Anmerkungen |
---|---|---|
|
URL-Formate:
Die Datei muss sich in einem benannten internen Stagingbereich oder in einem externen Stagingbereich befinden. |
Einfacher Zugriff auf zusätzliche Dateiattribute, wie z. B. die Dateigröße. |
|
URL-Formate:
Die Datei muss sich in einem benannten internen Stagingbereich oder in einem externen Stagingbereich befinden. |
Lesen einer mit SnowflakeFile
dynamisch spezifizierten Datei¶
Im folgenden Codebeispiel nimmt eine Handler-Funktion execute
einen String
-Wert entgegen und gibt einen String
-Wert mit dem Inhalt der Datei zurück. Zur Laufzeit initialisiert Snowflake die Variable fileName
des Handlers anhand des eingehenden Dateipfads in der Variablen input
der Prozedur. Der Handler-Code verwendet eine SnowflakeFile
-Instanz, um die Datei zu lesen.
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);
}
}
$$;
Der Code im folgenden CALL-Beispiel erstellt eine Bereichs-URL, die auf die Datei verweist. Dies ist eine kodierte URL, die temporären Zugriff auf eine Stagingdatei erlaubt, ohne dass Berechtigungen für den Stagingbereich erteilt werden müssen.
CALL file_reader_java_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Bemerkung
Bei einer gespeicherten Prozedur mit Eigentümerrechten muss der Eigentümer der Prozedur Zugriff auf alle Dateien haben, die keine Bereichs-URLs sind. Bei Prozeduren mit Aufruferrechten muss der Aufrufer Zugriff auf alle Dateien haben, die keine Bereichs-URLs sind. In beiden Fällen können Sie die Stagingdatei lesen, indem Ihr Handler-Code die Methode SnowflakeFile.newInstance
mit einem boolean
-Wert für einen neuen requireScopedUrl
-Parameter aufruft.
Das folgende Beispiel verwendet SnowflakeFile.newInstance
und gibt gleichzeitig an, dass keine Bereichs-URL erforderlich ist.
String filename = "@my_stage/filename.txt";
String sfFile = SnowflakeFile.newInstance(filename, false);
Lesen einer mit InputStream
dynamisch spezifizierten Datei¶
Im folgenden Codebeispiel nimmt eine Handler-Funktion execute
einen InputStream
-Wert entgegen und gibt einen String
-Wert mit dem Inhalt der Datei zurück. Zur Laufzeit initialisiert Snowflake die Variable stream
des Handlers anhand des eingehenden Dateipfads im input
-Argument der Prozedur. Der Handler-Code verwendet den InputStream
, um die Datei zu lesen.
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;
}
}
$$;
Der Code im folgenden CALL-Beispiel erstellt eine Bereichs-URL, die auf die Datei verweist. Dies ist eine kodierte URL, die temporären Zugriff auf eine Stagingdatei erlaubt, ohne dass Berechtigungen für den Stagingbereich erteilt werden müssen.
CALL file_reader_java_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));