Python으로 UDTF 작성하기

이 항목의 내용:

Python으로 사용자 정의 테이블 함수 (UDTF) 처리기를 구현할 수 있습니다. 이 핸들러 코드는 UDTF 호출 시 실행됩니다. 이 항목에서는 Python으로 핸들러를 구현하고 UDTF를 만드는 방법을 설명합니다.

UDTF는 테이블 형식의 결과를 반환하는 사용자 정의 함수(UDF)입니다. Python으로 구현한 UDF 핸들러에 대한 자세한 내용은 Python UDF 만들기 섹션을 참조하십시오. UDF에 대한 보다 일반적인 내용은 사용자 정의 함수 개요 섹션을 참조하십시오.

UDTF용 핸들러에서 입력 행을 처리할 수 있습니다(이 항목의 행 처리하기 참조). 또한 각 입력 파티션에 대해 실행되는 논리가 있을 수도 있습니다(이 항목의 파티션 처리하기 참조).

Python UDTF를 만들 때 다음을 수행합니다.

  1. UDTF 호출 시 Snowflake가 호출할 메서드로 클래스를 구현합니다.

    자세한 내용은 이 항목의 핸들러 구현하기 섹션을 참조하십시오.

  2. CREATE FUNCTION 명령으로 SQL로 작성된 UDTF를 만들어 클래스를 핸들러로 지정합니다. UDTF를 만들 때 다음을 지정합니다.

    • UDTF 입력 매개 변수의 데이터 타입.

    • UDTF에서 반환된 열의 데이터 타입.

    • UDTF 호출 시 핸들러로 실행하는 코드.

    • 핸들러가 구현되는 언어.

    구문에 대한 자세한 내용은 이 항목의 CREATE FUNCTION 으로 UDTF 만들기 섹션을 참조하십시오.

UDF 호출하기 에 설명된 대로 UDF 또는 UDTF를 호출할 수 있습니다.

참고

테이블 함수(UDTF)의 입력 인자 500개, 출력 열 500개로 제한됩니다.

Snowflake는 현재 다음 Python 버전에서 UDF 작성을 지원합니다.

  • 3.8

  • 3.9

  • 3.10

  • 3.11

CREATE FUNCTION 문에서 runtime_version 을 원하는 버전으로 설정합니다.

핸들러 구현하기

UDTF 인자 값을 테이블 형식의 결과로 처리하고 분할된 입력을 처리하는 핸들러 클래스를 구현합니다. 핸들러 클래스의 예는 이 항목의 핸들러 클래스의 예 섹션을 참조하십시오.

CREATE FUNCTION으로 UDTF를 만들 때 이 클래스를 UDTF의 핸들러로 지정합니다. 함수를 만드는 SQL에 대한 자세한 내용은 이 항목의 CREATE FUNCTION 으로 UDTF 만들기 섹션을 참조하십시오.

핸들러 클래스는 UDTF 호출 시 Snowflake가 호출할 메서드를 구현합니다. 이 클래스는 UDTF의 논리를 포함합니다.

메서드

요구 사항

설명

__init__ 메서드

선택 사항

입력 파티션의 상태 저장 처리를 위한 상태를 초기화합니다. 자세한 내용은 이 항목의 처리기 초기화하기 섹션을 참조하십시오.

process 메서드

필수

각 입력 행을 처리하여 테이블 형식 값을 튜플로 반환합니다. Snowflake는 이 메서드를 호출하여 UDTF의 인자에서 입력값을 전달합니다. 자세한 내용은 이 항목의 process 메서드 정의하기 섹션을 참조하십시오.

end_partition 메서드

선택 사항

입력 파티션 처리를 완료하여 테이블 형식 값을 튜플로 반환합니다. 자세한 내용은 이 항목의 파티션 처리 마무리하기 섹션을 참조하십시오.

핸들러 클래스의 임의의 메서드에서 예외가 발생하면 처리가 중지됩니다. UDTF를 호출한 쿼리는 오류 메시지와 함께 실패합니다.

참고

코드가 여기에 설명된 요구 사항을 충족하지 않으면 UDTF 생성 또는 실행이 실패할 수 있습니다. Snowflake는 CREATE FUNCTION 문 실행 시 위반 사항을 감지합니다.

핸들러 클래스의 예

다음 예제의 코드를 실행하면 파티션의 행을 처리하는 핸들러 클래스가 있는 UDTF가 생성됩니다. process 메서드는 각 입력 행을 처리하여 주식 매매의 총비용이 있는 행을 반환합니다. 파티션의 행을 처리한 후, 파티션에 포함된 모든 매매의 합계를 end_partition 메서드에서 반환합니다.

create or replace function stock_sale_sum(symbol varchar, quantity number, price number(10,2))
returns table (symbol varchar, total number(10,2))
language python
runtime_version=3.8
handler='StockSaleSum'
as $$
class StockSaleSum:
    def __init__(self):
        self._cost_total = 0
        self._symbol = ""

    def process(self, symbol, quantity, price):
      self._symbol = symbol
      cost = quantity * price
      self._cost_total += cost
      yield (symbol, cost)

    def end_partition(self):
      yield (self._symbol, self._cost_total)
$$;
Copy

다음 예제의 코드에서는 이전 UDF를 호출하여 stocks_table 테이블의 symbol, quantityprice 열의 값을 전달합니다. UDTF 호출에 대한 자세한 내용은 UDF 호출하기 섹션을 참조하십시오.

select stock_sale_sum.symbol, total
  from stocks_table, table(stock_sale_sum(symbol, quantity, price) over (partition by symbol));
Copy

처리기 초기화하기

핸들러가 행 처리를 시작하기 전에 Snowflake가 호출할 핸들러 클래스에서 __init__ 메서드를 선택적으로 구현할 수 있습니다. 예를 들어, 이 메서드를 사용하여 핸들러에 대해 파티션 범위가 지정된 상태를 설정할 수 있습니다. __init__ 메서드로 출력 행이 생성되지 않을 수 있습니다.

이 메서드의 서명은 다음과 같은 형식이어야 합니다.

def __init__(self):
Copy

예를 들어 다음과 같이 할 수 있습니다.

  • 파티션의 상태를 초기화한 다음 processend_partition 메서드에서 이 상태를 사용합니다.

  • 행당 한 번이 아니라 파티션당 한 번만 수행해야 하는 장기 실행 초기화를 실행합니다.

참고

핸들러 클래스 외부에 해당 코드를 포함함으로써, 클래스 선언 이전과 같이 파티션 처리가 시작되기 전에 논리를 한 번 실행할 수도 있습니다.

파티션 처리에 대한 자세한 내용은 이 항목의 파티션 처리하기 섹션을 참조하십시오.

__init__ 메서드를 사용하는 경우 __init__ 가 다음과 같은 특징이 있다는 점을 유념하십시오.

  • self 만 인자로 취할 수 있습니다.

  • 출력 행을 생성할 수 없습니다. 그 대신 process 메서드 구현을 사용하십시오.

  • 각 파티션에 대해 한 번, 그리고 process 메서드가 호출되기 전에 호출됩니다.

행 처리하기

Snowflake가 각 입력 행에 대해 호출할 process 메서드를 구현합니다.

process 메서드 정의하기

SQL 형식에서 변환된 UDTF 인자를 값으로 받는 process 메서드를 정의하여 Snowflake가 UDTF의 테이블 형식 반환 값을 만드는 데 사용할 데이터를 반환합니다.

이 메서드의 서명은 다음과 같은 형식이어야 합니다.

def process(self, *args):
Copy

process 메서드는 다음 조건을 충족해야 합니다.

  • self 매개 변수가 있어야 합니다.

  • UDTF 매개 변수에 해당하는 메서드 매개 변수를 선언해야 합니다.

    메서드 매개 변수 이름이 UDTF 매개 변수 이름과 일치할 필요는 없지만, UDTF 매개 변수가 선언된 것과 같은 순서로 메서드 매개 변수를 선언해야 합니다.

    UDTF 인자 값을 메서드에 전달할 때 Snowflake는 값을 SQL 형식에서 메서드에서 사용하는 Python 형식으로 변환합니다. Snowflake가 SQL 데이터 타입과 Python 데이터 타입 간에 매핑하는 방법에 대한 자세한 내용은 SQL-Python 데이터 타입 매핑 섹션을 참조하십시오.

  • 하나 이상의 튜플을 생성(또는 튜플을 포함한 이터러블을 반환)해야 하며, 이때 튜플의 시퀀스는 UDTF 반환 값 열의 시퀀스와 상응합니다.

    튜플 요소는 UDTF 반환 값 열이 선언된 것과 같은 순서로 나타나야 합니다. 자세한 내용은 이 항목의 값 반환하기 섹션을 참조하십시오.

    Snowflake는 값을 Python 형식에서 UDTF 선언에서 요구되는 SQL 형식으로 변환합니다. Snowflake가 SQL 데이터 타입과 Python 데이터 타입 간에 매핑하는 방법에 대한 자세한 내용은 SQL-Python 데이터 타입 매핑 섹션을 참조하십시오.

핸들러 클래스의 메서드에서 예외가 발생하면 처리가 중지됩니다. UDTF를 호출한 쿼리는 오류 메시지와 함께 실패합니다. process 메서드가 None 을 반환하면 처리가 중지됩니다. (process 메서드가 None 을 반환하더라도 end_partition 메서드는 여전히 호출됩니다.)

process 메서드의 예

다음 예제의 코드를 실행하면 세 UDTF 인자(symbol, quantity, price)를 처리하여 두 열(symbol, total)이 있는 단일 행을 반환하는 process 메서드가 있는 StockSale 핸들러 클래스가 표시됩니다. process 메서드 매개 변수는 stock_sale 매개 변수와 동일한 순서로 선언됩니다. process 메서드의 yield 문에 있는 인자는 stock_sale RETURNS TABLE 절에 선언된 열과 같은 순서입니다.

create or replace function stock_sale(symbol varchar, quantity number, price number(10,2))
returns table (symbol varchar, total number(10,2))
language python
runtime_version=3.8
handler='StockSale'
as $$
class StockSale:
    def process(self, symbol, quantity, price):
      cost = quantity * price
      yield (symbol, cost)
$$;
Copy

다음 예제의 코드에서는 이전 UDF를 호출하여 stocks_table 테이블의 symbol, quantityprice 열의 값을 전달합니다.

select stock_sale.symbol, total
  from stocks_table, table(stock_sale(symbol, quantity, price) over (partition by symbol));
Copy

값 반환하기

출력 행을 반환할 때 yield 또는 return (단, 둘 모두는 아님)을 사용하여 테이블 형식 값이 있는 튜플을 반환할 수 있습니다. 메서드가 None 을 반환하거나 생성하면 현재 행의 처리가 중지됩니다.

  • yield 를 사용할 때 각 출력 행에 대해 별도의 yield 문을 실행합니다. 이는 yield 와 함께 수반되는 지연 평가를 통해 보다 효율적으로 처리하고 시간 초과 방지에 도움이 될 수 있으므로 모범 사례입니다.

    튜플의 각 요소는 UDTF가 반환하는 결과에서 열 값이 됩니다. yield 인자의 순서는 CREATE FUNCTION의 RETURNS TABLE 절에서 반환 값에 대해 선언된 열의 순서와 일치해야 합니다.

    다음 예제의 코드는 두 행을 나타내는 값을 반환합니다.

    def process(self, symbol, quantity, price):
      cost = quantity * price
      yield (symbol, cost)
      yield (symbol, cost)
    
    Copy

    yield 인자는 튜플이므로 다음 예제와 같이 튜플의 단일 값을 전달할 때 후행 쉼표를 포함해야 합니다.

    yield (cost,)
    
    Copy
  • return 사용 시, 튜플이 있는 이터러블을 반환합니다.

    튜플에서 각각의 값은 UDTF가 반환하는 결과에서 열 값이 됩니다. 튜플에서 열 값의 순서는 CREATE FUNCTION의 RETURNS TABLE 절에서 반환 값에 대해 선언된 열의 순서와 일치해야 합니다.

    다음 예제의 코드는 각각 symbol과 total이라는 두 열이 있는 두 행을 반환합니다.

    def process(self, symbol, quantity, price):
      cost = quantity * price
      return [(symbol, cost), (symbol, cost)]
    
    Copy

행 건너뛰기

입력 행을 건너뛰고 그다음 행을 처리하려면(예: 입력 행의 유효성을 검사할 때) process 메서드가 다음 중 하나를 반환하도록 하십시오.

  • return 을 사용할 때 행을 건너뛰려면 None, None 을 포함한 목록 또는 빈 목록을 반환하십시오.

  • yield 를 사용할 때 행을 건너뛰려면 None 을 반환하십시오.

    yield 를 여러 번 호출하는 경우 Snowflake에서는 None 을 반환하는 호출 이후의 호출은 전부 무시합니다.

다음 예제의 코드는 number 가 양의 정수인 행만 반환합니다. number 가 양수가 아닌 경우 메서드는 현재 행을 건너뛰고 다음 행을 계속 처리하기 위해 None 을 반환합니다.

def process(self, number):
  if number < 1:
    yield None
  else:
    yield (number)
Copy

상태 저장 및 상태 비저장 처리

파티션 인식 방식으로 행을 처리하거나 단순히 행 단위로 처리하는 핸들러를 구현할 수 있습니다.

  • 파티션 인식 처리 에서는 핸들러에 파티션 범위가 지정된 상태를 관리하는 코드가 포함됩니다. 파티션 처리 시작 시에 실행되는 __init__ 메서드와 파티션의 마지막 행을 처리한 후 Snowflake가 호출하는 end_partition 메서드가 포함됩니다. 자세한 내용은 이 항목의 파티션 처리하기 섹션을 참조하십시오.

  • 파티션 비인식 처리 에서는 핸들러가 파티션 경계를 무시하고 상태를 저장하지 않고 실행됩니다.

    핸들러가 이와 같이 실행되도록 하려면 __init__ 또는 end_partition 메서드를 포함하지 마십시오.

파티션 처리하기

파티션마다 실행되는 코드(예: 상태 관리를 위한 코드)와 파티션의 각 행에 대해 실행되는 코드로 입력에서 파티션을 처리할 수 있습니다.

참고

UDTF 호출 시 파티션 지정에 대한 자세한 내용은 테이블 함수 및 파티션 섹션을 참조하십시오.

쿼리에 파티션이 포함되는 경우 열 값과 같이 지정된 값을 사용하여 행을 집계합니다. 핸들러가 수신하는 집계된 행은 해당 값으로 분할된다고 합니다. 각 파티션에 대한 처리가 파티션 범위 지정 상태를 포함하도록 코드가 이러한 파티션과 해당 행을 처리할 수 있습니다.

다음 SQL 예제의 코드는 주식 매매 정보를 쿼리합니다. 이 코드는 입력이 symbol 열의 값으로 분할된 stock_sale_sum UDTF를 실행합니다.

select stock_sale_sum.symbol, total
  from stocks_table, table(stock_sale_sum(symbol, quantity, price) over (partition by symbol));
Copy

수신 행이 분할되어 있더라도 코드에서 파티션 분리를 무시하고 그냥 행을 처리할 수 있다는 점을 유념하십시오. 예를 들어, 핸들러 클래스 __init__ 메서드 및 end_partition 메서드와 같은 파티션 범위 지정 상태를 처리하도록 설계된 코드를 생략하고 process 메서드를 그냥 구현할 수 있습니다. 자세한 내용은 이 항목의 상태 저장 및 상태 비저장 처리 섹션을 참조하십시오.

각 파티션을 하나의 단위로 처리하려면 다음을 수행합니다.

  • 파티션 처리를 초기화할 핸들러 클래스 __init__ 메서드를 구현합니다.

    자세한 내용은 이 항목의 처리기 초기화하기 섹션을 참조하십시오.

  • process 메서드로 각 행을 처리할 때 파티션 인식 코드를 포함합니다.

    행 처리에 대한 자세한 내용은 이 항목의 행 처리하기 섹션을 참조하십시오.

  • end_partition 메서드를 구현하여 파티션 처리를 마무리합니다.

    자세한 내용은 이 항목의 파티션 처리 마무리하기 섹션을 참조하십시오.

다음은 파티션별로 실행하도록 설계된 코드를 포함했을 때 핸들러의 호출 시퀀스에 대한 설명입니다.

  1. 파티션 처리가 시작되어 첫 번째 행의 처리가 완료되기 전에, Snowflake는 핸들러 클래스의 __init__ 메서드를 사용하여 클래스의 인스턴스를 만듭니다.

    여기서는 파티션 범위 지정 상태를 설정할 수 있습니다. 예를 들어 파티션의 행에서 계산된 값을 보유하는 인스턴스 변수를 초기화할 수 있습니다.

  2. 파티션의 각 행에 대해 Snowflake는 process 메서드를 호출합니다.

    이 메서드는 실행될 때마다 상태 값을 변경할 수 있습니다. 예를 들어, process 메서드가 인스턴스 변수의 값을 업데이트하도록 할 수 있습니다.

  3. Snowflake는 코드가 파티션의 마지막 행을 처리한 후에 end_partition 메서드를 호출합니다.

    이 메서드에서 반환하려는 파티션 수준 값이 포함된 출력 행을 반환할 수 있습니다. 예를 들어 파티션의 행을 처리하면서 업데이트한 인스턴스 변수의 값을 반환할 수 있습니다.

    end_partition 메서드는 파티션의 마지막 행을 처리한 후 단순히 호출하기만 하는 Snowflake에서는 어떤 인자도 받지 않습니다.

파티션 처리 마무리하기

파티션의 모든 행을 처리한 후 Snowflake가 호출할 핸들러 클래스에서 end_partition 메서드를 선택적으로 구현할 수 있습니다. 이 메서드에서는 파티션의 모든 행이 처리된 후 파티션의 코드를 실행할 수 있습니다. end_partition 메서드는 파티션 범위 지정 계산의 결과 반환과 같은 출력 행을 생성할 수 있습니다. 자세한 내용은 이 항목의 파티션 처리하기 섹션을 참조하십시오.

이 메서드의 서명은 다음과 같은 형식이어야 합니다.

def end_partition(self):
Copy

Snowflake는 다음과 같은 end_partition 메서드 구현을 예상합니다.

  • 메서드가 정적이지 않아야 합니다.

  • 메서드에 self 이외에는 매개 변수가 없을 수도 있습니다.

  • 테이블 형식 값 반환의 대체 수단으로, 빈 목록 또는 None 을 생성할 수 있습니다.

참고

Snowflake는 성공적으로 처리하도록 시간 제한이 조정된 대형 파티션을 지원하지만, 특히 대형 파티션으로 인해 처리 시간이 초과될 수 있습니다(예: end_partition 이 완료하는 데 너무 오래 걸리는 경우). 특정 사용 시나리오에 맞게 시간 초과 임계값을 조정해야 하는 경우 Snowflake 지원 에 문의하십시오.

파티션 처리의 예

다음 예제의 코드를 실행하면 (process 메서드에서) 먼저 매입당 비용을 계산해 매입 금액을 함께 더함으로써 어떤 주식의 매입을 위해 지불한 총비용이 계산됩니다. 이 코드는 end_partition 메서드에서 총계를 반환합니다.

UDTF 호출과 함께 이 처리기를 포함하는 UDTF의 예는 핸들러 클래스의 예 섹션을 참조하십시오.

class StockSaleSum:
  def __init__(self):
    self._cost_total = 0
    self._symbol = ""

  def process(self, symbol, quantity, price):
    self._symbol = symbol
    cost = quantity * price
    self._cost_total += cost
    yield (symbol, cost)

  def end_partition(self):
    yield (self._symbol, self._cost_total)
Copy

파티션을 처리할 때는 다음 사항을 유념하십시오.

  • 사용자의 코드가 UDTF에 대한 호출에 명시적으로 지정되지 않은 파티션을 처리할 수 있습니다. UDTF에 대한 호출에 PARTITION BY 절이 포함되지 않더라도 Snowflake는 데이터를 암시적으로 분할합니다.

  • process 메서드는 파티션의 ORDER BY 절에 지정된 순서대로 행 데이터(있는 경우)를 수신합니다.

가져온 패키지 사용하기

Snowflake에서 제공되는 Anaconda의 선별된 서드 파티 패키지 목록에 포함된 Python 패키지를 사용할 수 있습니다. 이러한 패키지를 UDTF의 종속 항목으로 지정하려면 CREATE FUNCTION에서 PACKAGES 절을 사용하십시오.

Snowflake에서 다음 SQL을 실행하여 포함된 패키지의 목록을 검색할 수 있습니다.

select * from information_schema.packages where language = 'python';
Copy

자세한 내용은 서드 파티 패키지 사용하기Python UDF 만들기 섹션을 참조하십시오.

다음 예제의 코드에서는 NumPy(Numerical Python) 패키지의 함수를 사용하여 각각 주당 가격이 다른 주식 매입 배열에서 주당 평균 가격을 계산합니다.

create or replace function stock_sale_average(symbol varchar, quantity number, price number(10,2))
returns table (symbol varchar, total number(10,2))
language python
runtime_version=3.8
packages = ('numpy')
handler='StockSaleAverage'
as $$
import numpy as np

class StockSaleAverage:
    def __init__(self):
      self._price_array = []
      self._quantity_total = 0
      self._symbol = ""

    def process(self, symbol, quantity, price):
      self._symbol = symbol
      self._price_array.append(float(price))
      cost = quantity * price
      yield (symbol, cost)

    def end_partition(self):
      np_array = np.array(self._price_array)
      avg = np.average(np_array)
      yield (self._symbol, avg)
$$;
Copy

다음 예제의 코드에서는 이전 UDF를 호출하여 stocks_table 테이블의 symbol, quantityprice 열의 값을 전달합니다. UDTF 호출에 대한 자세한 내용은 UDF 호출하기 섹션을 참조하십시오.

select stock_sale_average.symbol, total
  from stocks_table,
  table(stock_sale_average(symbol, quantity, price)
    over (partition by symbol));
Copy

작업자 프로세스로 동시 작업 실행하기

Python 작업자 프로세스를 사용하여 동시 작업을 실행할 수 있습니다. 웨어하우스 노드에서 여러 CPU 코어를 활용하는 병렬 작업을 실행해야 할 때 이 기능이 유용할 수 있습니다.

참고

기본 제공된 Python 다중 처리 모듈을 사용하지 않는 것이 좋습니다.

Python Global Interpreter Lock 으로 인해 멀티태스킹 접근 방식이 모든 CPU 코어에서 확장되지 못하는 문제를 해결하려면 스레드가 아닌 별도의 작업자 프로세스를 사용하여 동시 작업을 실행할 수 있습니다.

다음 예에서처럼 joblib 라이브러리의 Parallel 클래스를 사용하여 Snowflake 웨어하우스에서 이 작업을 수행할 수 있습니다.

CREATE OR REPLACE FUNCTION joblib_multiprocessing_udtf(i INT)
  RETURNS TABLE (result INT)
  LANGUAGE PYTHON
  RUNTIME_VERSION = 3.8
  HANDLER = 'JoblibMultiprocessing'
  PACKAGES = ('joblib')
AS $$
import joblib
from math import sqrt

class JoblibMultiprocessing:
  def process(self, i):
    pass

  def end_partition(self):
    result = joblib.Parallel(n_jobs=-1)(joblib.delayed(sqrt)(i ** 2) for i in range(10))
    for r in result:
      yield (r, )
$$;
Copy

참고

joblib.Parallel 에 사용되는 기본 백엔드는 Snowflake 표준과 Snowpark 최적화 웨어하우스 간에 다릅니다.

  • 표준 웨어하우스 기본값: threading

  • Snowpark 최적화 웨어하우스 기본값: loky (다중 처리)

다음 예에서처럼 joblib.parallel_backend 함수를 호출하여 기본 백엔드 설정을 재정의할 수 있습니다.

import joblib
joblib.parallel_backend('loky')
Copy

CREATE FUNCTION 으로 UDTF 만들기

CREATE FUNCTION 명령을 사용하여 SQL로 UDTF를 만들어 작성한 코드를 핸들러로 지정합니다. 명령 참조는 CREATE FUNCTION 섹션을 참조하십시오.

UDTF를 만들 때 다음 구문을 사용하십시오.

CREATE OR REPLACE FUNCTION <name> ( [ <arguments> ] )
  RETURNS TABLE ( <output_column_name> <output_column_type> [, <output_column_name> <output_column_type> ... ] )
  LANGUAGE PYTHON
  [ IMPORTS = ( '<imports>' ) ]
  RUNTIME_VERSION = 3.8
  [ PACKAGES = ( '<package_name>' [, '<package_name>' . . .] ) ]
  [ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
  HANDLER = '<handler_class>'
  [ AS '<python_code>' ]
Copy

작성한 핸들러 코드를 UDTF와 연결하려면 CREATE FUNCTION 실행 시 다음을 수행하십시오.

  • RETURNS TABLE에서 열 이름 및 형식 쌍에 출력 열을 지정합니다.

  • LANGUAGE를 PYTHON으로 설정합니다.

  • 핸들러 클래스가 스테이지와 같은 외부 위치에 있는 경우 IMPORTS 절 값을 핸들러 클래스의 경로와 이름으로 설정합니다.

    자세한 내용은 Python UDF 만들기 섹션을 참조하십시오.

  • RUNTIME_VERSION을 코드에서 필요한 Python 런타임 버전으로 설정합니다. 지원되는 Python 버전은 다음과 같습니다.

    • 3.8

    • 3.9

    • 3.10

    • 3.11

  • PACKAGES 절 값을 핸들러 클래스에 필요한 하나 이상의 패키지(있는 경우)의 이름으로 설정합니다.

    자세한 내용은 서드 파티 패키지 사용하기Python UDF 만들기 섹션을 참조하십시오.

  • HANDLER 절 값을 핸들러 클래스의 이름으로 설정합니다.

    Python 핸들러 코드를 UDTF와 연결할 때 코드를 인라인으로 포함하거나 Snowflake 스테이지상의 한 위치에서 참조할 수 있습니다. HANDLER 값은 대/소문자를 구분하며 Python 클래스의 이름과 일치해야 합니다.

    자세한 내용은 인라인 코드가 있는 UDF와 스테이지에서 업로드된 코드가 있는 UDF 섹션을 참조하십시오.

    중요

    스칼라 Python UDF의 경우 HANDLER 절 값에는 메서드 이름이 포함됩니다.

    Python UDTF의 경우 HANDLER 절 값에는 클래스 이름이 포함되지만 메서드 이름은 포함되지 않습니다.

    이런 차이가 나는 이유는 스칼라 Python UDF의 경우, 핸들러 메서드 이름을 사용자가 선택하므로 Snowflake가 미리 알지 못하지만, Python UDTF의 경우 메서드(예: end_partition 메서드)의 이름은 Snowflake에 의해 지정된 이름과 일치해야 하기 때문에 알려져 있다는 점입니다.

  • 핸들러 코드가 CREATE FUNCTION과 함께 인라인으로 지정된 경우 AS '<python_code>' 절이 필요합니다.