사용자 정의 함수 개요

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
$$;
Copy

다음 예제의 코드는 addone UDF를 실행합니다.

SELECT addone(3);
Copy

지원되는 언어

여러 프로그래밍 언어 중 하나로 함수의 처리기(해당 논리)를 작성합니다. 각 언어를 사용하여 언어 및 해당 런타임 환경의 제약 조건 내에서 데이터를 조작할 수 있습니다. 처리기 언어에 관계없이, 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 섹션을 참조하십시오.

함수는 저장 프로시저와 특정 보안 문제를 공유합니다. 자세한 내용은 다음을 참조하십시오.

처리기 코드 배포

함수를 생성할 때 함수의 논리를 구현하는 처리기를 CREATE FUNCTION 문으로 인라인 코드로 지정하거나 스테이지에 패키징 및 복사되는 컴파일된 코드와 같이 문 외부의 코드로 지정할 수 있습니다.

자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.

함수 생성 및 호출하기

SQL을 사용하여 사용자 정의 함수를 생성하고 호출합니다.

  • 함수를 생성하려면 함수의 처리기를 지정하여 CREATE FUNCTION 문을 실행하십시오. 자세한 내용은 UDF 만들기 섹션을 참조하십시오.

  • 함수를 호출하려면 함수를 매개 변수로 지정하는 SQL SELECT 문을 실행하십시오. 자세한 내용은 UDF 호출하기 섹션을 참조하십시오.