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