UDF 소개
UDF 소개 (Introduction to UDFs)
Trino 사용자가 직접 작성하는 커스텀 함수인 사용자 정의 함수(UDF)의 개념을 소개하는 문서예요. 인라인 UDF와 카탈로그 UDF의 차이부터 시작해요.
출처: 문서
본문
사용자 정의 함수(UDF)는 Trino 사용자가 클라이언트 애플리케이션에서 작성하는 커스텀 함수예요. UDF는 내장 함수와 비슷하게 단일 출력 값을 반환하는 스칼라 함수예요.
Note
커스텀 함수는 Java로 작성해 플러그인으로 배포할 수도 있어요. 자세한 내용은 개발자 가이드에서 확인할 수 있어요.
UDF 선언
SQL FUNCTION 키워드와 SQL 사용자 정의 함수 또는 Python 사용자 정의 함수에 지원되는 문으로 UDF를 선언해요.
UDF는 현재 쿼리에서 사용할 인라인 UDF로 선언하거나, 이후의 어떤 쿼리에서도 사용할 카탈로그 UDF로 선언할 수 있어요.
인라인 사용자 정의 함수
인라인 사용자 정의 함수(인라인 UDF)는 쿼리 처리 컨텍스트 안에서 UDF를 선언하고 사용해요. UDF는 쿼리 앞의 WITH 블록에서 선언돼요:
WITH
FUNCTION doubleup(x integer)
RETURNS integer
RETURN x * 2
SELECT doubleup(21);
-- 42
인라인 UDF 이름은 SQL 식별자 명명 규칙을 따라야 하며, . 문자를 포함할 수 없어요.
UDF 선언은 쿼리의 컨텍스트 안에서만 유효해요. 이후에 별도로 호출하는 것은 불가능해요. 이것이 필요하다면 카탈로그 UDF를 사용해요.
여러 인라인 UDF 선언은 쉼표로 구분하며, 호출되는 UDF가 첫 호출 전에 선언되어 있다면 서로 호출하는 UDF들을 포함할 수 있어요.
WITH
FUNCTION doubleup(x integer)
RETURNS integer
RETURN x * 2,
FUNCTION doubleupplusone(x integer)
RETURNS integer
RETURN doubleup(x) + 1
SELECT doubleupplusone(21);
-- 43
인라인 UDF는 내장 함수의 의미를 가리고 재정의할 수 있다는 점을 유의해요:
WITH
FUNCTION abs(x integer)
RETURNS integer
RETURN x * 2
SELECT abs(-10); -- -20, not 10!
카탈로그 사용자 정의 함수
카탈로그에 사용된 커넥터가 UDF 저장을 지원하면, UDF를 카탈로그 컨텍스트에 저장할 수 있어요. 다음 커넥터가 카탈로그 UDF 저장을 지원해요:
- Hive 커넥터
- Memory 커넥터
이 시나리오에서 다음 명령을 사용할 수 있어요:
CREATE FUNCTION: UDF를 만들고 저장해요.DROP FUNCTION: UDF를 제거해요.SHOW FUNCTIONS: 카탈로그의 UDF 목록을 표시해요.
카탈로그 UDF는 카탈로그 이름과 스키마 이름을 UDF 이름과 결합한 이름을 사용해야 해요. 예를 들어 example 카탈로그의 default 스키마에 있는 power UDF는 example.default.power예요.
호출은 example.default.power처럼 완전 한정 이름을 사용해야 해요.
UDF용 SQL 환경 구성
sql.default-function-catalog와 sql.default-function-schema SQL 환경 속성을 구성하면 UDF의 기본 저장소를 설정할 수 있어요. 해당 카탈로그와 스키마는 sql.path에도 추가해야 해요. 그러면 사용자들이 UDF에 대한 전체 경로를 지정하지 않고도 UDF를 호출하고 모든 사용자 정의 함수 관리를 수행할 수 있어요.
Note
카탈로그에서 Memory 커넥터를 사용하면 UDF를 간단히 저장하고 테스트할 수 있어요.
권장 사항
UDF 처리는 클러스터에서 메모리와 처리 측면에서 자원을 많이 소모할 수 있어요. UDF를 작성하고 실행할 때 다음 사항을 고려해요:
- 쿼리의 런타임 동작에 대한 일부 검사(따라서 UDF 처리)가 마련되어 있어요. 예를 들어 쿼리 처리가 하드코딩된 임계값보다 오래 걸리면 처리가 자동으로 종료돼요.
- 루프 구조에서 배열 생성을 피해요. 각 반복이 모든 항목이 있는 새 배열을 만들고 각 수정마다 데이터를 복사해, 이전 배열은 나중에 자동 정리를 위해 메모리에 남겨요. 루프 대신 람다 표현식을 사용해요.
- 루프 구조에서 문자열 연결을 피해요. 각 반복이 새 문자열을 만들고 각 수정마다 이전 문자열을 복사해, 이전 문자열은 나중에 자동 정리를 위해 메모리에 남겨요. 루프 대신 람다 표현식을 사용해요.
- 특별한 null 처리가 없다면 대부분의 UDF는
RETURNS NULL ON NULL INPUT특성을 선언해야 해요. 기본 특성이CALLED ON NULL INPUT이므로 이를 명시적으로 선언해야 해요.
더 알아보기 (Learn more)
UDF를 실제로 선언하는 문법은 FUNCTION 문서에서, SQL로 작성하는 법과 Python으로 작성하는 법은 각각 SQL 사용자 정의 함수와 Python 사용자 정의 함수 문서에서 다루고 있어요.