Python 사용자 정의 함수
Python 사용자 정의 함수 (Python UDF)
함수 정의에 Python 프로그래밍 언어를 사용하는 사용자 정의 함수예요. Python의 풍부한 문법으로 함수 본문을 작성할 수 있어요.
출처: 문서
본문
Python 사용자 정의 함수는 함수 정의에 Python 프로그래밍 언어와 문을 사용하는 사용자 정의 함수예요.
Python UDF 선언
다음 단계로 Python UDF를 인라인 또는 카탈로그 UDF로 선언해요:
FUNCTION키워드로 UDF 이름과 매개변수를 선언해요.RETURNS선언을 추가해 결과의 데이터 타입을 지정해요.LANGUAGE를PYTHON으로 설정해요.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 안에서 사용할 수 없어요:
bdbconcurrentcursesensurepipdoctestidlelibmultiprocessingpdbpydocsocketserversqlite3sslsubprocesstkinterturtleunittestvenvwebbrowserwsgirefxmlrpc
다음 라이브러리는 런타임에 명시적으로 추가되어 Python UDF 안에서 사용할 수 있어요:
attrsbleachcharset-normalizerdefusedxmlidnajmespathjsonschemapyasn1pyparsingpython-dateutilrsatomliua-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 datetime과 time 객체는 마이크로초 정밀도만 지원해요. 더 높은 정밀도의 Trino 인자 값은 Python 값으로 변환될 때 반올림되며, Python 반환 값은 Trino 반환 타입이 마이크로초보다 낮은 정밀도를 가지면 반올림돼요.
시간대 있는 타임스탬프
고정 오프셋 시간대만 지원돼요. 정치적 시간대(political time zone)를 가진 타임스탬프는 해당 타임스탬프의 순간(instant)에 대한 시간대의 오프셋으로 변환돼요.
더 알아보기 (Learn more)
Python UDF의 실제 사용 예시는 예시 Python UDF 문서에서, SQL로 작성하는 UDF는 SQL 사용자 정의 함수 문서에서 확인할 수 있어요.