Python 사용자 정의 함수

Python 사용자 정의 함수 (Python UDF)

함수 정의에 Python 프로그래밍 언어를 사용하는 사용자 정의 함수예요. Python의 풍부한 문법으로 함수 본문을 작성할 수 있어요.

출처: 문서

본문

Python 사용자 정의 함수는 함수 정의에 Python 프로그래밍 언어와 문을 사용하는 사용자 정의 함수예요.

Python UDF 선언

다음 단계로 Python UDF를 인라인 또는 카탈로그 UDF로 선언해요:

  • FUNCTION 키워드로 UDF 이름과 매개변수를 선언해요.
  • RETURNS 선언을 추가해 결과의 데이터 타입을 지정해요.
  • LANGUAGEPYTHON으로 설정해요.
  • WITH 블록의 handler 속성으로 호출할 Python 함수의 이름을 선언해요.
  • AS 키워드 뒤에 $$로 Python 코드를 감싸요.
  • handler 속성에서 함수를 추가하고 선언된 데이터 타입을 반환하는지 확인해요.
  • 사용 가능한 Python 언어로 함수를 구현하도록 Python 코드 섹션을 확장해요.

다음 스니펫은 의사 코드를 보여줘요:

FUNCTION python_udf_name(input_parameter data_type)
  RETURNS result_data_type
  LANGUAGE PYTHON
  WITH (handler = 'python_function')
  AS $$
  ...
  def python_function(input):
      return ...
  ...
  $$

입력 정수 값 x에 2를 곱해 반환하는 UDF doubleup을 선언하는 최소 예시예요. 예시는 인라인 사용자 정의 함수로 선언하고 값 21로 호출해 결과 42를 얻는 방법을 보여줘요.

SQL 사용자 정의 함수의 기본 SQL을 덮어쓰도록 언어를 PYTHON으로 설정해요. Python 코드는 $$로 감싸며 유효한 포맷이어야 해요.

WITH
  FUNCTION doubleup(x integer)
    RETURNS integer
    LANGUAGE PYTHON
    WITH (handler = 'twice')
    AS $$
    def twice(a):
        return a * 2
    $$
SELECT doubleup(21);
-- 42

같은 UDF는 카탈로그 사용자 정의 함수로도 선언할 수 있어요.

더 복잡한 사용 사례와 예시는 예시 Python UDF 문서를 참고해요.

Python 언어 세부 사항

Trino Python UDF 통합은 샌드박스 환경에서 Python 3.13.0을 사용해요. Python 코드는 Trino를 실행하는 Java 가상 머신 안의 WebAssembly(WASM) 런타임 안에서 실행돼요.

들여쓰기를 포함한 Python 언어 규칙을 지켜야 해요.

따라서 Python UDF는 샌드박스 런타임에 포함된 Python 언어와 핵심 라이브러리에만 접근할 수 있어요. 네트워크나 파일 시스템 연산으로 외부 자원에 접근하는 것은 지원되지 않아요. 다른 Python 라이브러리나 명령줄 도구, 패키지 관리자 사용도 지원되지 않아요.

다음 라이브러리는 런타임에서 명시적으로 제거되어 Python UDF 안에서 사용할 수 없어요:

  • bdb
  • concurrent
  • curses
  • ensurepip
  • doctest
  • idlelib
  • multiprocessing
  • pdb
  • pydoc
  • socketserver
  • sqlite3
  • ssl
  • subprocess
  • tkinter
  • turtle
  • unittest
  • venv
  • webbrowser
  • wsgiref
  • xmlrpc

다음 라이브러리는 런타임에 명시적으로 추가되어 Python UDF 안에서 사용할 수 있어요:

  • attrs
  • bleach
  • charset-normalizer
  • defusedxml
  • idna
  • jmespath
  • jsonschema
  • pyasn1
  • pyparsing
  • python-dateutil
  • rsa
  • tomli
  • ua-parser

타입 매핑

다음 표는 Python UDF의 입력·출력 값에 대해 지원되는 Trino 타입과 대응하는 Python 타입을 보여줘요:

Trino type Python type
ROW tuple
ARRAY list
MAP dict
BOOLEAN bool
TINYINT int
SMALLINT int
INTEGER int
BIGINT int
REAL float
DOUBLE float
DECIMAL decimal.Decimal
VARCHAR str
VARBINARY bytes
DATE datetime.date
TIME datetime.time
TIME WITH TIME ZONE datetime.time with datetime.tzinfo
TIMESTAMP datetime.datetime
TIMESTAMP WITH TIME ZONE datetime.datetime with datetime.tzinfo
INTERVAL YEAR TO MONTH int (월 수)
INTERVAL DAY TO SECOND datetime.timedelta
JSON str
UUID uuid.UUID
IPADDRESS ipaddress.IPv4Address 또는 ipaddress.IPv6Address

시간과 타임스탬프

Python datetimetime 객체는 마이크로초 정밀도만 지원해요. 더 높은 정밀도의 Trino 인자 값은 Python 값으로 변환될 때 반올림되며, Python 반환 값은 Trino 반환 타입이 마이크로초보다 낮은 정밀도를 가지면 반올림돼요.

시간대 있는 타임스탬프

고정 오프셋 시간대만 지원돼요. 정치적 시간대(political time zone)를 가진 타임스탬프는 해당 타임스탬프의 순간(instant)에 대한 시간대의 오프셋으로 변환돼요.

더 알아보기 (Learn more)

Python UDF의 실제 사용 예시는 예시 Python UDF 문서에서, SQL로 작성하는 UDF는 SQL 사용자 정의 함수 문서에서 확인할 수 있어요.