서버리스 작업을 위한 Python 및 Java 지원

서버리스 작업 은 사용자 정의 함수(UDFs) 및 Python, Java 및 Scala로 작성된 저장 프로시저 등의 오브젝트 유형 및 함수를 호출할 수 있습니다.

여러 가지 방법으로 작업에 Python이나 Java를 사용할 수 있습니다. 이러한 옵션의 차이점을 이해하려면 저장 프로시저를 작성할지 사용자 정의 함수를 작성할지 선택하기 섹션을 참조하십시오.

사용자 정의 함수

작업의 AS 절에서 호출할 UDFs를 생성할 수 있습니다. SQL을 사용하여 UDFs에서 사용할 수 없는 작업을 수행할 수 있습니다. 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에서 반환된 테이블과 task2 의 역할로 저장 프로시저를 호출하는 dev 를 생성합니다.

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