Python- und Java-Unterstützung für serverlose Aufgaben

Serverlose Aufgaben können die folgenden Objekttypen und Funktionen aufrufen: benutzerdefinierte Funktionen (UDFs) und gespeicherte Prozeduren, die in Python, Java und Scala geschrieben sind.

Sie können Python oder Java auf verschiedene Weise in Ihren Aufgaben einsetzen. Um den Unterschied zwischen diesen Optionen zu verstehen, lesen Sie Entscheidung über das Schreiben einer gespeicherten Prozedur oder einer benutzerdefinierten Funktion.

Benutzerdefinierte Funktionen

Sie können UDFs erstellen, um sie in der AS-Klausel Ihrer Aufgabe aufzurufen. Sie können UDFs verwenden, um Operationen durchzuführen, die unter SQL nicht verfügbar sind. Weitere Informationen zu UDFs finden Sie unter Überblick über benutzerdefinierte Funktionen.

Die folgenden Beispiele in Python und Java erstellen eine Funktion, die zum Eingabewert eine Eins hinzufügt.

CREATE OR REPLACE FUNCTION addone(i int)
  RETURNS int
  LANGUAGE python
  RUNTIME_VERSION = '3.8'
  HANDLER = 'addone_py'
  AS
    $$
    def addone_py(i):
      return i+1
    $$;
Copy

Die folgenden Beispiele erstellen my_task2, die zum Rückgabewert von my_task1 eine Eins hinzufügt.

CREATE OR REPLACE TASK IF NOT EXISTS my_task2
  AFTER my_task1
  AS
    SELECT addone(SYSTEM$GET_PREDECESSOR_RETURN_VALUE());
Copy

Gespeicherte Prozeduren

Sie können gespeicherte Prozeduren erstellen, die Sie in der AS-Klausel Ihrer Aufgabe aufrufen. Gespeicherte Prozeduren führen im Allgemeinen administrative Operationen aus, indem sie SQL Anweisungen ausführen. Weitere Informationen zu gespeicherten Prozeduren finden Sie unter Übersicht zu gespeicherten Prozeduren.

Die folgenden Beispiele in Python und Java akzeptieren einen Tabellennamen und einen Rollennamen, um eine gefilterte Tabelle mit Zeilen zurückzugeben, die der angegebenen Rolle entsprechen.

CREATE OR REPLACE PROCEDURE filterByRole(tableName VARCHAR, role VARCHAR)
  RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR)
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.8'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'filter_by_role'
  AS
    $$
    from snowflake.snowpark.functions import col

    def filter_by_role(session, table_name, role):
      df = session.table(table_name)
      return df.filter(col("role") == role)
    $$;
Copy

Die folgenden Beispiele erstellen task2, die die gespeicherte Prozedur mit der von task1 zurückgegebenen Tabelle und der Rolle dev aufruft.

CREATE OR REPLACE TASK IF NOT EXISTS my_task2
  AFTER my_task1
  AS
    CALL filterByRole(SYSTEM$GET_PREDECESSOR_RETURN_VALUE(), 'dev');
Copy

SQL AS-Klausel.

Sie können Python- oder Java-Code auch direkt in der AS-Klausel Ihrer Definition definieren.

Das folgende Beispiel verwendet Python, um den Rückgabewert von task2 auf eine Zeichenfolge festzulegen..

CREATE OR REPLACE TASK IF NOT EXISTS task2
  SCHEDULE = '1 minute'
  AS
    $$
    print(Task completed successfully.)
    $$
  ;
Copy