サーバーレスタスクのためのPythonとJavaサポート¶
サーバーレスタスク は、以下のオブジェクトタイプと関数を呼び出すことができます。ユーザー定義関数(UDFs)と、Python、Java、Scalaで書かれたストアドプロシージャ。
PythonやJavaをタスクに使う方法はいくつかあります。これらのオプションの違いについては、 ストアドプロシージャとユーザー定義関数のどちらを記述するかの選択 を参照してください。
ユーザー定義関数¶
タスクの AS 句で呼び出す UDFs を作成できます。UDFs を使って、 SQL ではできない操作を行うことができます。UDFs の詳細については、 ユーザー定義関数の概要 をご参照ください。
以下のPythonとJavaの例では、入力値に1を足す関数を作成しています。
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;
}
}';
以下の例では、 my_task1
の戻り値に1を加算する my_task2
を作成しています。
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());
ストアドプロシージャ¶
タスクの AS 句で呼び出すストアドプロシージャを作成できます。ストアドプロシージャは通常、 SQL ステートメントを実行することによって管理操作を実行します。ストアドプロシージャの詳細については、 ストアドプロシージャの概要 をご参照ください。
PythonとJavaの以下の例では、テーブル名とロール名を受け取り、指定されたロールにマッチする行でフィルタリングされたテーブルを返します。
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;
}
}
$$;
以下の例では、task1から返されたテーブルと dev
のロールでストアドプロシージャを呼び出す task2
を作成しています。
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 句¶
タスク定義の AS 句で直接PythonまたはJavaコードを定義することもできます。
以下の例では、Pythonを使って task2
の戻り値を文字列に設定しています。
CREATE OR REPLACE TASK IF NOT EXISTS task2
SCHEDULE = '1 minute'
AS
$$
print(Task completed successfully.)
$$
;