사용자 정의 함수 개요¶
UDF(사용자 정의 함수)를 작성하여 Snowflake에서 기본적으로 제공되는 시스템 정의 함수를 통해 할 수 없는 작업을 수행하도록 시스템을 확장할 수 있습니다. UDF를 생성하면 여러 번 재사용할 수 있습니다.
UDF는 Snowflake를 확장하는 한 가지 방법일 뿐입니다. 다른 방법은 다음 섹션을 참조하십시오.
참고
UDF는 저장 프로시저와 비슷하지만 두 가지 중요한 면에서 다릅니다. 자세한 내용은 저장 프로시저를 작성할지 사용자 정의 함수를 작성할지 선택하기 섹션을 참조하십시오.
이 항목의 내용:
UDF(사용자 정의 함수)란?¶
UDF(사용자 정의 함수)는 SQL에서 호출할 수 있도록 정의하는 함수입니다. SQL에서 호출할 수 있는 기본 제공 함수 와 마찬가지로, UDF의 논리는 일반적으로 SQL에 없거나 잘 작동하지 않는 기능으로 SQL을 확장하거나 향상합니다. UDF를 사용해 코드의 여러 위치에서 반복적으로 호출할 수 있도록 기능을 캡슐화할 수도 있습니다.
지원되는 언어 중 하나로 UDF의 논리(해당 처리기)를 작성합니다. 처리기가 있으면 CREATE FUNCTION 명령으로 UDF를 생성 한 다음, SELECT 문으로 UDF를 호출 할 수 있습니다.
스칼라 및 테이블 형식 함수¶
단일 값(스칼라 UDF)을 반환하거나 테이블 형식 값(사용자 정의 테이블 함수 또는 UDTF)을 반환하는 UDF를 작성할 수 있습니다.
스칼라 함수(UDF)는 각 입력 행에 대해 하나의 출력 행을 반환합니다. 반환된 행은 단일 열/값으로 구성됩니다.
테이블 형식 함수(UDTF)는 각 입력 행에 대해 테이블 형식 값을 반환합니다. UDTF에 대한 처리기에서 Snowflake에 필요한 인터페이스를 준수하는 메서드를 작성합니다. 이러한 메서드는 다음을 수행합니다.
파티션의 각 행을 처리합니다(필수 사항).
각 파티션에 대해 처리기를 한 번씩 초기화합니다(선택 사항).
각 파티션에 대한 처리를 완료합니다(선택 사항).
메서드의 이름은 처리기 언어에 따라 다릅니다. 지원되는 언어 목록은 지원되는 언어 섹션을 참조하십시오.
고려 사항¶
쿼리가 스테이징된 파일에 액세스하는 UDF를 호출하는 경우 뷰의 함수가 스테이징된 파일에 액세스하는지 여부에 관계없이 SQL 문이 모든 UDF 또는 UDTF를 호출하는 뷰도 쿼리하면 사용자 오류가 발생하며 작업이 실패합니다.
UDTF는 여러 파일을 병렬로 처리할 수 있지만, UDF는 현재 파일을 직렬로 처리합니다. 해결 방법으로는, GROUP BY 절을 사용하여 하위 쿼리에 행을 그룹화하십시오. 예제는 UDTF로 CSV 처리하기 섹션을 참조하십시오.
현재, 쿼리 실행 중에 쿼리에서 참조되는 스테이징된 파일이 수정되거나 삭제될 경우에는 오류가 발생하며 함수 호출이 실패합니다.
시작하기¶
SQL로 작성된 처리기로 UDTF를 작성하는 방법에 대한 자습서는 빠른 시작: 사용자 정의 SQL 함수 시작하기 를 참조하십시오.
UDF의 예¶
다음 예제의 코드는 Python으로 작성된 처리기를 사용하여 addone
이라는 UDF를 생성합니다. 처리기 함수는 addone_py
입니다. 이 UDF는 int
를 반환합니다.
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
$$;
다음 예제의 코드는 addone
UDF를 실행합니다.
SELECT addone(3);
지원되는 언어¶
여러 프로그래밍 언어 중 하나로 함수의 처리기(해당 논리)를 작성합니다. 각 언어를 사용하여 언어 및 해당 런타임 환경의 제약 조건 내에서 데이터를 조작할 수 있습니다. 처리기 언어에 관계없이, SQL을 사용하여 처리기 및 처리기 언어를 지정하는 것과 동일한 방식으로 프로시저 자체를 생성합니다.
다음 언어 중 하나로 처리기를 작성할 수 있습니다.
언어 |
개발자 가이드 |
---|---|
Java |
|
JavaScript |
|
Python |
|
Scala |
|
SQL |
언어 선택¶
여러 프로그래밍 언어 중 하나로 UDF의 처리기(해당 논리)를 작성합니다. 각 언어를 사용하여 언어 및 해당 런타임 환경의 제약 조건 내에서 데이터를 조작할 수 있습니다.
다음과 같은 경우 특정 언어를 선택할 수 있습니다.
이미 해당 언어로 된 코드가 있는 경우.
예를 들어 처리기로 작동할 Java 메서드가 이미 있고 메서드의 오브젝트가 .jar 파일에 있는 경우 .jar을 스테이지에 복사하고 처리기를 클래스 및 메서드로 지정한 다음 언어를 Java로 지정할 수 있습니다.
이 언어에는 다른 언어에는 없는 기능이 있습니다.
이 언어에 수행해야 할 처리 작업의 수행에 도움이 될 수 있는 라이브러리가 있습니다.
언어를 선택할 때 다음 사항도 고려하십시오.
지원되는 처리기 위치. 일부 언어에서는 스테이지에서 처리기 참조를 지원하지 않습니다(대신 처리기 코드는 인라인이어야 함). 자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
처리기를 통해 공유 가능한 UDF를 얻을 수 있는지 여부. 공유 가능한 UDF는 Snowflake Secure Data Sharing 기능과 함께 사용할 수 있습니다.
언어 |
처리기 위치 |
공유 가능 |
---|---|---|
Java |
인라인 또는 스테이징됨 |
아니요 [1] |
JavaScript |
인라인 |
예 |
Python |
인라인 또는 스테이징됨 |
아니요 [2] |
Scala |
인라인 또는 스테이징됨 |
아니요 [3] |
SQL |
인라인 |
예 |
개발자 가이드¶
지침 및 제약 조건¶
- Snowflake 제약 조건:
Snowflake 제약 조건 내에서 개발하여 Snowflake 환경 내에서 안정성을 보장할 수 있습니다. 자세한 내용은 Snowflake에서 적용한 제약 조건 내에서 유지되는 처리기 설계하기 섹션을 참조하십시오.
- 명명:
다른 함수와 충돌하지 않도록 함수 이름을 지정해야 합니다. 자세한 내용은 프로시저와 UDF의 명명 및 오버로딩 섹션을 참조하십시오.
- 인자:
인자를 지정하고 선택적인 표시합니다. 자세한 내용은 UDF 및 저장 프로시저에 대한 인자 정의하기 섹션을 참조하십시오.
- 데이터 타입 매핑:
각 처리기 언어에 대해 언어의 데이터 타입과 인자 및 반환 값에 사용되는 SQL 유형 간에 별도의 매핑 세트가 있습니다. 각 언어의 매핑에 대한 자세한 내용은 SQL 및 처리기 언어 간의 데이터 타입 매핑 섹션을 참조하십시오.
처리기 작성¶
- 처리기 언어:
처리기 작성에 대한 언어별 콘텐츠는 지원되는 언어 섹션을 참조하십시오.
- 외부 네트워크 액세스:
외부 네트워크 액세스 로 외부 네트워크 위치에 액세스할 수 있습니다. Snowflake 외부의 특정 네트워크 위치에 대한 보안 액세스를 생성한 다음, 처리기 코드 내에서 해당 액세스를 사용할 수 있습니다.
- 로깅 및 추적:
로그 메시지와 추적 이벤트를 캡처하고 나중에 쿼리할 수 있는 데이터베이스에 데이터를 저장하여 코드 활동을 기록할 수 있습니다.
보안¶
UDF 또는 UDTF로 특정 SQL 작업을 수행하는 데 필요한 오브젝트에 대한 권한을 부여할 수 있습니다. 자세한 내용은 Granting Privileges for User-Defined Functions 섹션을 참조하십시오.
함수는 저장 프로시저와 특정 보안 문제를 공유합니다. 자세한 내용은 다음을 참조하십시오.
UDF 및 프로시저의 보안 모범 사례 에 설명된 모범 사례에 따라 프로시저의 처리기 코드가 안전하게 실행되도록 도울 수 있습니다.
민감한 정보에 액세스하면 안 되는 사용자가 민감한 정보를 볼 수 없도록 되어 있는지 확인합니다. 자세한 내용은 Secure UDF와 저장 프로시저로 민감한 정보 보호하기 섹션을 참조하십시오.
처리기 코드 배포¶
함수를 생성할 때 함수의 논리를 구현하는 처리기를 CREATE FUNCTION 문으로 인라인 코드로 지정하거나 스테이지에 패키징 및 복사되는 컴파일된 코드와 같이 문 외부의 코드로 지정할 수 있습니다.
자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
함수 생성 및 호출하기¶
SQL을 사용하여 사용자 정의 함수를 생성하고 호출합니다.