サーバーレスタスクのための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
    $$;
Copy

以下の例では、 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());
Copy

ストアドプロシージャ

タスクの 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)
    $$;
Copy

以下の例では、task1から返されたテーブルと dev のロールでストアドプロシージャを呼び出す task2 を作成しています。

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

SQL AS 句

タスク定義の AS 句で直接PythonまたはJavaコードを定義することもできます。

以下の例では、Pythonを使って task2 の戻り値を文字列に設定しています。

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