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

SnowflakeFile

URL-Formate:

  • Bereichs-URL, um das Risiko von Angriffen per Dateieinschleusung zu verringern, wenn der Aufrufer der Funktion nicht deren Eigentümer ist.

  • Datei-URL oder Dateipfad-Zeichenfolge von Dateien, auf die der Eigentümer der Prozedur Zugriff hat.

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.

InputStream

URL-Formate:

  • Bereichs-URL, um das Risiko von Angriffen per Dateieinschleusung zu verringern, wenn der Aufrufer der Funktion nicht deren Eigentümer ist.

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);
  }
}
$$;
Copy

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'));
Copy

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);
Copy

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;
  }
}
$$;
Copy

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'));
Copy
OSZAR »