Schreiben von Scala-Handlern für mit SQL erstellte gespeicherte Prozeduren¶
Sie können eine gespeicherte Prozedur erstellen, deren Handler in Scala geschrieben ist. Sie können die Snowpark-Bibliothek innerhalb Ihrer gespeicherten Prozedur verwenden, um Abfragen, Aktualisierungen und andere Arbeiten an Tabellen in Snowflake auszuführen.
Mit gespeicherten Snowpark-Prozeduren können Sie Ihre Datenpipeline in Snowflake erstellen und ausführen, wobei ein Snowflake-Warehouse als Compute-Framework dient. Für den Code Ihrer Datenpipeline verwenden Sie die Snowpark-API für Scala zum Schreiben der gespeicherten Prozeduren. Um die Ausführung dieser gespeicherten Prozeduren zu planen, verwenden Sie Aufgaben (Tasks).
Sie können während der Ausführung Ihres Handler-Codes Protokoll- und Ablaufverfolgungsdaten erfassen. Weitere Informationen dazu finden Sie unter Protokollierung, Ablaufverfolgung und Metriken.
Scala-Handler für eine gespeicherte Prozedur schreiben¶
Stellen Sie sicher, dass Ihre Umgebung die Voraussetzungen von erfüllt.
Wenn Sie lokal entwickeln, richten Sie Ihre Umgebung so ein, dass Sie Snowpark verwenden.
Wählen Sie, ob Sie Ihren Handler inline oder in einem Stagingbereich einsetzen möchten.
Befolgen Sie die Richtlinien für Klasse oder Objekt, Methode oder Funktion und Leistung des Handlers.
Implementieren Sie Unterstützung für Features wie Datenzugriff, Lesen von Dateien, Rückgabe von Tabellendaten und Protokollierung und Ablaufverfolgung.
Machen Sie die Abhängigkeiten Ihres Codes auf Snowflake verfügbar.
Fügen Sie Ihren Handler-Code inline oder importiert aus einem Stagingbereich ein, wenn Sie die gespeicherte Prozedur erstellen.
Bemerkung
Um eine anonyme Prozedur sowohl zu erstellen als auch aufzurufen, verwenden Sie CALL (mit anonymer Prozedur). Das Erstellen und Aufrufen einer anonymen Prozedur erfordert keine Rolle mit CREATE PROCEDURE-Schemaberechtigungen.
Voraussetzungen erfüllen¶
Sie müssen Version 1.1.0 oder eine neuere Version der Snowpark-Bibliothek verwenden.
Wenn Sie eine gespeicherte Prozedur schreiben, deren Handler-Code in einen Stagingbereich kopiert wird, müssen Sie Ihre Klassen für die Ausführung in Java, Version 11.x kompilieren.
Einrichten Ihrer Entwicklungsumgebung für Snowpark¶
Wenn Sie Ihren Code lokal entwickeln, richten Sie Ihre Entwicklungsumgebung für die Verwendung der Snowpark-Bibliothek ein. Siehe Einrichten Ihrer Entwicklungsumgebung für Snowpark Scala.
Strukturieren und Erstellen von Handler-Code¶
Sie können den Handler-Quellcode inline mit demSQL-Code aufbewahren, der die Prozedur erstellt, oder das kompilierte Ergebnis des Handlers an einem separaten Ort aufbewahren und von SQL aus referenzieren. Weitere Informationen dazu finden Sie unter Speichern von Handler-Code inline oder in einem Stagingbereich.
Weitere Informationen zum Erstellen von Handler-Quellcode zur Verwendung mit einer Prozedur finden Sie unter Packen des Handler-Codes.
Richtlinien für die Handler-Klasse oder das Objekt¶
Beim Schreiben der Handler-Klasse oder des Objekts ist Folgendes zu beachten:
Die Klasse (oder das Objekt) und die Methode dürfen nicht geschützt oder privat sein.
Wenn die Methode nicht statisch ist und Sie einen Konstruktor definieren möchten, definieren Sie einen Null-Argument-Konstruktor für die Klasse. Snowflake ruft diesen Null-Argument-Konstruktor zur Initialisierungszeit auf, um eine Instanz Ihrer Klasse zu erstellen.
Sie können in derselben Klasse oder demselben Objekt verschiedene Methoden für verschiedene gespeicherte Prozeduren definieren.
Leitlinien für die Handler-Methode oder -Funktion¶
Beachten Sie beim Schreiben der Methode oder Funktion für die gespeicherte Prozedur Folgendes:
Geben Sie das Snowpark-
Session
-Objekt als erstes Argument Ihrer Methode oder Funktion an.Wenn Sie Ihre gespeicherte Prozedur aufrufen, erstellt Snowflake automatisch ein
Session
-Objekt und übergibt dieses an Ihre gespeicherte Prozedur. (Sie können dasSession
-Objekt nicht selbst erstellen.)Für die restlichen Argumente und den Rückgabewert werden die Scala-Typen verwendet, die den Snowflake-Datentypen entsprechen.
Ihre Methode oder Funktion muss einen Wert zurückgeben.
Die Ausführung einer gespeicherten Prozedur wird zeitlich begrenzt, es sei denn, der Timer wird durch die Aktivität des Codes zurückgesetzt. Insbesondere wird der Timeout-Timer durch die Interaktionen des Codes mit Daten zurückgesetzt, einschließlich Dateioperationen, Abfragen und Iterationen durch ein Resultset.
Wenn Sie einen asynchronen untergeordneten Job aus dem Handler einer Prozedur heraus ausführen, wird „Fire-and-Forget“ nicht unterstützt.
Mit anderen Worten: Wenn der Handler eine untergeordnete Abfrage ausgibt, die noch ausgeführt wird, wenn der Job der übergeordneten Prozedur abgeschlossen ist, wird der untergeordnete Job automatisch abgebrochen.
Richtlinien für die Leistung und Sicherheit von Handlern¶
Um sicherzustellen, dass Ihr Code unter Snowflake gut läuft, befolgen Sie folgende Richtlinien:
Begrenzen Sie den Verbrauch von Arbeitsspeicher.
Snowflake belegt Methoden mit einer Begrenzung hinsichtlich der benötigten Menge an Arbeitsspeicher. Weitere Informationen dazu, wie Sie zu hohen Speicherverbrauch vermeiden können, finden Sie unter Entwerfen von Handlern unter Berücksichtigung der Snowflake-bedingten Einschränkungen.
Schreiben Sie thread-sicheren Code.
Stellen Sie sicher, dass Ihre Handler-Methode oder Funktion threadsicher ist.
Beachten Sie die Sicherheitseinschränkungen.
Da Ihr Handler-Code wird innerhalb einer eingeschränkten Engine ausgeführt wird, sollten Sie unbedingt die unter Sicherheitsverfahren für UDFs und Prozeduren beschriebenen Regeln befolgen.
Entscheiden Sie, ob Sie Eigentümerrechte oder Aufruferrechte nutzen möchten.
Entscheiden Sie bei der Planung Ihrer gespeicherten Prozedur, ob Sie die gespeicherte Prozedur mit Aufruferrechten oder Eigentümerrechten ausführen möchten.
Berücksichtigen Sie das Timeout-Verhalten von gespeicherten Prozeduren.
Die Ausführung einer gespeicherten Prozedur wird zeitlich begrenzt, es sei denn, der Timer wird durch die Aktivität des Codes zurückgesetzt. Insbesondere wird der Timeout-Timer durch die Interaktionen des Codes mit Daten zurückgesetzt, einschließlich Dateioperationen, Abfragen und Iterationen durch ein Resultset.
Abhängigkeiten für Code zur Verfügung stellen¶
Wenn Ihr Handler-Code von Code abhängt, der außerhalb des Handlers selbst definiert ist (z. B. Klassen in einer JAR-Datei) oder von Ressourcendateien, können Sie diese Abhängigkeiten für Ihren Code zur Verfügung stellen, indem Sie ihn in einen Stagingbereich hochladen. Beim Erstellen der Prozedur können Sie diese Abhängigkeiten mithilfe der IMPORTS-Klausel referenzieren.
Weitere Informationen dazu finden Sie unter Abhängigkeiten für Code zur Verfügung stellen.