Erstellen von gespeicherten Prozeduren für DataFrames in Scala

Mit der Snowpark-API können Sie gespeicherte Prozeduren für Ihre kundenspezifischen Lambdas und Funktionen erstellen. Sie können diese gespeicherten Prozeduren aufrufen, um die Daten in Ihrem DataFrame zu verarbeiten.

Sie können Folgendes erstellen:

Erstellen einer temporären gespeicherten Prozedur

Sie können eine temporäre Prozedur erstellen, die nur für die aktuelle Sitzung gilt. Die temporäre Prozedur kann Folgendes sein:

  • Eine anonyme Prozedur, die Sie per Referenz aufrufen können (Call-by-Reference), indem Sie z. B. eine com.snowflake.snowpark.StoredProcedure-Variable, die sie repräsentiert, an den Code übergeben, der die Prozedur aufruft.

  • Eine benannte Prozedur mit einem von Ihnen zugewiesenen Namen. Sie können die Prozedur von anderem Code innerhalb der Sitzung aus über den Namen aufrufen.

Um eine temporäre Prozedur zu erstellen, registrieren Sie sie mit einer der registerTemporary-Methoden von com.snowflake.snowpark.SProcRegistration. Die Methode ist mehrfach überladen, um eine unterschiedliche Anzahl von Prozedurargumenten zu unterstützen.

Wenn Sie registerTemporary aufrufen, können Sie Folgendes als Argument übergeben:

  • Den Namen der Prozedur (wenn es sich um eine benannte Prozedur handelt)

  • Die Prozedur selbst als Lambda-Ausdruck

Erstellen einer anonymen temporären Prozedur

Um eine anonyme temporäre Prozedur zu erstellen, registrieren Sie sie als temporäre Prozedur, ohne einen Namen anzugeben. Snowflake erstellt einen versteckten Namen für seine eigene Verwendung.

Der Code im folgenden Beispiel ruft die Methode SProcRegistration.registerTemporary auf, um eine anonyme Prozedur aus einer Lambda-Funktion zu erstellen. Der Funktion selbst werden ein Session-Objekt und eine Ganzzahl als Argumente übergeben. Das Session-Argument repräsentiert einen impliziten Parameter, den der Aufrufer nicht als Argument übergeben muss.

val session = Session.builder.configFile("my_config.properties").create

val sp = session.sproc.registerTemporary(
  (session: Session, num: Int) => num + 1
)
Copy

Der Code im folgenden Beispiel ruft die anonyme Prozedur mit der Methode storedProcedure der Klasse com.snowflake.snowpark.Session auf und übergibt die Variablen sp und 1 als Argumente. Beachten Sie, dass das Session-Objekt ein implizites Argument ist, das nicht übergeben werden muss, wenn Sie die Prozedur aufrufen.

session.storedProcedure(sp, 1).show()
Copy

Erstellen einer benannten temporären Prozedur

Um eine benannte temporäre Prozedur zu erstellen, registrieren Sie sie als temporäre Prozedur und übergeben ihren Namen als eines der Argumente.

Der Code im folgenden Beispiel ruft die Methode registerTemporary auf, um eine benannte temporäre Prozedur namens add_two aus einem Lambda-Ausdruck zu erstellen, wobei der Name der Prozedur als Argument übergeben wird. Die Methode registriert einen Typ Int als den einen Parametertyp.

Der Prozedur selbst werden ein Session-Objekt und eine Ganzzahl als Argumente übergeben. Das Session-Argument repräsentiert einen impliziten Parameter, den der Aufrufer nicht als Argument übergeben muss.

val session = Session.builder.configFile("my_config.properties").create

val procName: String = "add_two"
val tempSP: StoredProcedure =
  session.sproc.registerTemporary(
    procName,
    (session: Session, num: Int) => num + 2)
Copy

Der Code im folgenden Beispiel ruft die Prozedur add_two mit einer storedProcedure-Methode der Klasse com.snowflake.snowpark.Session auf und übergibt den Prozedurnamen und 1 als Argumente. Beachten Sie, dass das Session-Objekt ein implizites Argument ist, das nicht übergeben werden muss, wenn Sie die Prozedur aufrufen.

session.storedProcedure(procName, 1).show()
Copy

Erstellen einer permanenten gespeicherten Prozedur

Sie können eine permanente gespeicherte Prozedur erstellen, die Sie von jeder Sitzung aus aufrufen können, auch aus einem Snowflake-Arbeitsblatt heraus.

Um eine permanente Prozedur zu erstellen, registrieren Sie sie mit einer registerPermanent-Methode der Klasse com.snowflake.snowpark.SProcRegistration. Die Methode ist mehrfach überladen, um eine Vielzahl von Prozeduranforderungen zu unterstützen.

Wenn Sie registerPermanent aufrufen, übergeben Sie Folgendes als Argumente:

  • Den Namen der Prozedur

  • Die Prozedur selbst als Lambda-Ausdruck

  • Einen vorhandenen Stagingbereich, in den Snowflake die Dateien kopieren soll, die beim Kompilieren der Prozedur entstehen.

    Snowflake kopiert alle zugehörigen Daten, einschließlich Abhängigkeiten und Lambda-Funktionen. Dies muss ein permanenter Stagingbereich sein (nicht temporär für eine Sitzung), da diese gespeicherte Prozedur außerhalb der aktuellen Sitzung aufgerufen werden kann. Wenn der Vorgang später abgebrochen wird, müssen Sie die zugehörigen Dateien manuell aus dem Stagingbereich entfernen.

  • Einen booleschen Wert, der angibt, ob diese Prozedur mit Aufruferrechten ausgeführt werden soll.

    Weitere Informationen zu Aufruferrechten und Eigentümerrechten finden Sie unter Understanding Caller’s Rights and Owner’s Rights Stored Procedures.

Der Code im folgenden Beispiel ruft die Methode registerPermanent auf, um eine permanente Prozedur namens add_hundred aus einem Lambda-Ausdruck zu erstellen.

Die Methode gibt einen Stagingbereich namens sproc_libs für die Prozedur und deren Abhängigkeiten an. Sie legt auch fest, dass die Prozedur mit Aufruferrechten ausgeführt werden soll.

Der Prozedur selbst werden ein Session-Objekt und eine Ganzzahl als Argumente übergeben. Das Session-Argument repräsentiert einen impliziten Parameter, den der Aufrufer nicht als Argument übergeben muss.

val session = Session.builder.configFile("my_config.properties").create

val procName: String = "add_hundred"
val stageName: String = "sproc_libs"

val sp: StoredProcedure =
  session.sproc.registerPermanent(
    procName,
    (session: Session, num: Int) => num + 100,
    stageName,
    true
  )
Copy

Der Code im folgenden Beispiel ruft die Prozedur add_hundred über eine storedProcedure-Methode der Klasse com.snowflake.snowpark.Session auf. Der Aufruf übergibt als Argumente den Prozedurnamen und 1. Beachten Sie, dass das im Handler als Argument verwendete Session-Objekt ein implizites Argument ist, das Sie beim Aufruf der Prozedur nicht übergeben müssen.

session.storedProcedure(procName, 1).show()
Copy