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
$$;
CREATE OR REPLACE FUNCTION add_one(i int)
RETURNS int
LANGUAGE java
CALLED ON NULL INPUT
HANDLER = 'TestFunc.addOne'
TARGET_PATH = '@~/testfunc.jar'
AS
'class TestFunc {
public static int addOne(int i) {
return i+1;
}
}';
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());
CREATE OR REPLACE TASK IF NOT EXISTS my_task2
AFTER my_task1
AS
SELECT add_one(SYSTEM$GET_PREDECESSOR_RETURN_VALUE());
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)
$$;
CREATE OR REPLACE PROCEDURE filter_by_role(table_name VARCHAR, role VARCHAR)
RETURNS TABLE()
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
HANDLER = 'FilterClass.filterByRole'
AS
$$
import com.snowflake.snowpark_java.*;
public class FilterClass {
public DataFrame filterByRole(Session session, String tableName, String role) {
DataFrame table = session.table(tableName);
DataFrame filteredRows = table.filter(Functions.col("role").equal_to(Functions.lit(role)));
return filteredRows;
}
}
$$;
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');
CREATE OR REPLACE TASK IF NOT EXISTS my_task2
AFTER my_task1
AS
CALL filter_by_role(SYSTEM$GET_PREDECESSOR_RETURN_VALUE(), 'dev');
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.)
$$
;