Schreiben von Scala-Handlern für mit SQL erstellte gespeicherte Prozeduren

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 UDF 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.

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.

var filename = "@my_stage/filename.txt"
var sfFile = SnowflakeFile.newInstance(filename, false)
Copy

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_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)
  }
}
$$;
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_scala_proc_snowflakefile(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy

Lesen einer mit InputStream dynamisch spezifizierten Datei

Der Code im folgenden Beispiel definiert eine Handler-Funktion execute, die eine InputStream annimmt und eine String mit dem Inhalt der Datei zurückgibt. Zur Laufzeit initialisiert Snowflake die Variable stream des Handlers anhand des eingehenden Dateipfads in der Variablen input der Prozedur. Der Handler-Code verwendet den InputStream, um die Datei zu lesen.

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

Der Code im folgenden CALL-Beispiel erstellt eine kodierte Bereichs-URL, die auf die Datei verweist. Eine verschlüsselte URL erlaubt den vorübergehenden Zugriff auf eine Stagingdatei, ohne Berechtigungen für den Stagingbereich selbst zu gewähren.

CALL file_reader_scala_proc_input(BUILD_SCOPED_FILE_URL('@sales_data_stage', '/car_sales.json'));
Copy