사용자 정의 함수 생성하기

Snowflake에서 사용 가능한 여러 메서드 중 하나를 사용하여 사용자 정의 함수(UDF) 를 만들 수 있습니다. 이러한 메서드는 이 항목에 설명되어 있습니다.

다음 경우에 UDF를 만듭니다.

  1. Python, Java, Scala 등 지원되는 여러 언어 중 하나를 사용하여 함수 로직을 처리기로 작성하십시오.

  2. 도구를 선택하거나 API 에서 작성한 처리기로 함수를 만듭니다.

    각 항목에 대한 자세한 내용은 UDF 생성을 위한 도구 섹션을 참조하십시오.

    SQL

    SQL 을 사용하여 여러 언어 중 하나로 로직을 작성하십시오.

    Snowpark

    Java, Python 또는 Scala용 Snowpark API 를 사용하십시오.

    명령줄

    CLI 명령을 실행하여 함수를 만듭니다.

    Python API

    클라이언트 측 Python 명령을 실행하여 함수를 생성합니다.

    REST

    RESTful API 에 요청하여 함수를 생성합니다.

  3. 필요에 따라 여러 도구 중 하나를 사용하여 함수를 실행합니다.

UDF 생성을 위한 도구

사용 가능한 언어 및 스킬 세트에 따라 Snowflake에서 사용할 수 있는 여러 가지 방법 중 하나를 사용하여 UDF 를 만들 수 있습니다. 다음 표에서 필요에 맞는 도구를 선택하십시오.

언어

접근 방식

SQL

SQL 명령을 실행합니다(예: Snowsight 사용).

SQL CREATE FUNCTION 명령을 실행하여 다음 언어 중 하나로 작성된 처리기 코드가 포함된 함수를 생성합니다.

Snowpark를 사용하는 Java, Python 또는 Scala

지원되는 언어 중 하나로 코드를 작성한 다음 로컬에서 코드를 실행하여 Snowflake에서 작업을 수행합니다.

다음 언어 중 하나로 Snowpark API를 사용하는 클라이언트 코드를 실행합니다.

명령줄

명령줄에서 명령을 실행하여 Snowflake 엔터티를 만들고 관리할 수 있습니다.

Snowflake CLI 의 명령을 실행합니다.

Python

클라이언트에서 Snowflake에서 관리 작업을 실행하는 코드를 작성합니다.

Snowflake Python API 를 사용하는 코드를 실행합니다.

RESTful API (언어 불문)

RESTful 엔드포인트에 요청하여 Snowflake 엔터티를 생성하고 관리하십시오.

Snowflake REST API 를 사용하여 프로시저를 생성하도록 요청합니다.

키 속성

다음은 함수를 만들 때 필요하거나 일반적으로 사용되는 몇 가지 속성에 대한 설명입니다.

함수 이름:

함수 이름은 처리기의 이름과 일치할 필요가 없습니다. 이름 제약 조건과 규칙에 대한 자세한 내용은 프로시저와 UDF의 명명 및 오버로딩 섹션을 참조하십시오.

인자:

요구 사항에 대한 자세한 내용은 UDF 및 저장 프로시저에 대한 인자 정의하기 섹션을 참조하십시오.

반환 유형:

Snowflake가 SQL 데이터 타입을 처리기 데이터 타입에 매핑하는 방법에 대한 자세한 내용은 SQL 및 처리기 언어 간의 데이터 타입 매핑 섹션을 참조하십시오.

처리기 이름:

필요한 경우 이는 함수가 실행될 때 실행되는 코드를 포함하는 클래스 또는 메서드의 이름입니다. Java, Python, Scala로 작성된 처리기에 대해서만 처리기 이름을 지정해야 합니다. JavaScript 및 SQL 처리기의 경우 인라인으로 지정된 모든 코드가 처리기로 실행됩니다.

종속성:

Java, Python 또는 Scala로 작성된 처리기의 경우 함수를 생성할 때와 같이 Snowpark 라이브러리를 지정해야 할 수도 있습니다.

처리기에서 종속 항목을 사용할 수 있도록 만드는 방법에 대한 자세한 내용은 코드에 종속성을 사용할 수 있도록 만들기 섹션을 참조하십시오.

처리기 언어 런타임:

처리기 언어가 Java, Python 또는 Scala인 경우 런타임 버전을 지정하여 사용할 지원되는 런타임 버전을 표시합니다. 기본 버전을 사용하는 경우 시간이 지나면 기본값이 변경된다는 점에 유의하십시오.

액세스 제어 요구 사항

이 작업을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.

권한

오브젝트

참고

CREATE FUNCTION

스키마

이 권한으로만 스키마에서 사용자 정의 함수만 생성할 수 있습니다.

데이터 메트릭 함수 생성을 활성화하려면 역할에 CREATE DATA METRIC FUNCTION 권한이 있어야 합니다.

USAGE

함수

새로 생성한 함수에 대한 USAGE 권한을 역할에 부여하면 해당 역할(예: 외부 토큰화에 대한 마스킹 정책 소유자 역할)을 가진 사용자가 Snowflake의 다른 곳에서 함수를 호출할 수 있습니다.

USAGE

외부 액세스 통합

통합(있는 경우)에 필요하며, EXTERNAL_ACCESS_INTEGRATIONS 매개 변수로 지정됩니다. 자세한 내용은 CREATE EXTERNAL ACCESS INTEGRATION 섹션을 참조하십시오.

READ

시크릿

SECRETS 매개 변수로 지정된 시크릿(있는 경우)에 필요합니다. 자세한 내용은 자격 증명을 나타내는 시크릿 만들기함수 또는 프로시저에서 외부 액세스 통합 사용하기 섹션을 참조하십시오.

USAGE

스키마

SECRETS 매개 변수로 지정된 시크릿이 포함된 스키마(있는 경우)에 필요합니다. 자세한 내용은 자격 증명을 나타내는 시크릿 만들기함수 또는 프로시저에서 외부 액세스 통합 사용하기 섹션을 참조하십시오.

스키마의 모든 오브젝트에 대해 작업을 수행하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한.

지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.

보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.

사용법 노트

다음 노트에서는 처리기 작성에 지원되는 언어와 관련된 사용법 노트를 설명합니다. 다음 섹션의 참고 사항은 SQL CREATE FUNCTION 명령의 절을 참조하지만, 이러한 절은 일반적으로 함수를 만드는 데 사용할 수 있는 다른 도구에서 다른 방식으로 표현됩니다.

모든 언어

  • function_definition 에는 크기 제한이 있습니다. 허용 가능한 최대 크기는 변경될 수 있습니다.

  • function_definition 주위의 구분 기호는 작은따옴표 또는 한 쌍의 달러 기호일 수 있습니다.

    $$ 를 구분 기호로 사용하면 작은따옴표가 포함된 함수를 더 쉽게 작성할 수 있습니다.

    함수 본문의 구분 기호가 작은따옴표 문자인 경우 반드시 function_definition 내의 모든 작은따옴표(예: 문자열 리터럴)를 작은따옴표로 이스케이프해야 합니다.

  • 마스킹 정책 에서 UDF를 사용하는 경우 열의 데이터 타입, UDF, 마스킹 정책이 일치하는지 확인하십시오. 자세한 내용은 마스킹 정책의 사용자 정의 함수 섹션을 참조하십시오.

  • UDF의 핸들러 코드에 CURRENT_DATABASE 또는 CURRENT_SCHEMA 함수를 지정하면 함수는 세션에 사용 중인 데이터베이스 또는 스키마가 아니라 UDF가 포함된 데이터베이스 또는 스키마를 반환합니다.

  • 메타데이터 관련:

    주의

    고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.

  • CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.

Java

  • Java에서 기본 데이터 타입은 NULL 값을 허용하지 않으므로, 이러한 유형의 인자에 대해 NULL을 전달하면 오류가 발생합니다.

  • HANDLER 절에서 메서드 이름은 대/소문자를 구분합니다.

  • IMPORTS 및 TARGET_PATH 절에서는 다음과 같습니다.

    • 패키지, 클래스 및 파일 이름은 대/소문자를 구분합니다.

    • 스테이지 이름은 대/소문자를 구분하지 않습니다.

  • PACKAGES 절을 사용하여 Snowflake 시스템 정의 종속성에 대한 패키지 이름과 버전 번호(예: Snowpark의 패키지 이름과 버전 번호)를 지정할 수 있습니다. 다른 종속 항목의 경우 IMPORTS 절을 사용하여 종속 항목 JAR 파일을 지정합니다.

  • Snowflake는 다음의 유효성을 검사합니다.

    • CREATE FUNCTION 문의 HANDLER에 지정된 JAR 파일이 존재하고 이 파일에는 지정된 클래스와 메서드가 있습니다.

    • UDF 선언에 지정된 입력 및 출력 유형은 Java 메서드의 입력 및 출력 유형과 호환됩니다.

    유효성 검사는 활동 중인 Snowflake 웨어하우스에 연결되어 있는지 여부에 따라 생성 시 또는 실행 시 수행할 수 있습니다.

    • 생성 시간 — CREATE FUNCTION 문이 실행될 때 활성 상태인 Snowflake 웨어하우스에 연결되어 있으면 UDF 는 생성 시점에 유효성이 검사됩니다.

    • 실행 시간 — 활동 중인 Snowflake 웨어하우스에 연결되어 있지 않은 경우 UDF 가 생성되지만 즉시 유효성이 검사되지 않으며, Snowflake는 다음 메시지를 반환합니다.

      Function <이름> created successfully, but could not be validated since there is no active warehouse

JavaScript

  • Snowflake는 UDF 생성 시점에는 JavaScript 코드의 유효성을 검사하지 않습니다. 즉, 코드가 유효한지 여부에 관계없이 UDF 생성은 성공합니다. 코드가 유효하지 않으면 쿼리 시 UDF 를 호출할 때 Snowflake가 오류를 반환합니다.

Python

  • HANDLER 절에서 핸들러 함수 이름은 대/소문자를 구분합니다.

  • IMPORTS 절에서:

    • 파일 이름은 대/소문자를 구분합니다.

    • 스테이지 이름은 대/소문자를 구분하지 않습니다.

  • PACKAGES 절을 사용하여 종속성에 대한 패키지 이름과 버전 번호(예: Snowpark의 패키지)를 지정할 수 있습니다. 다른 종속 항목의 경우 IMPORTS 절을 사용하여 종속 항목 파일을 지정합니다.

  • Snowflake는 다음의 유효성을 검사합니다.

    • CREATE FUNCTION 문의 HANDLER에 지정된 함수 또는 클래스가 존재합니다.

    • UDF 선언에 지정된 입력 및 출력 유형은 핸들러의 입력 및 출력 유형과 호환됩니다.

Scala

  • HANDLER 절에서 메서드 이름은 대/소문자를 구분합니다.

  • IMPORTS 및 TARGET_PATH 절에서는 다음과 같습니다.

    • 패키지, 클래스 및 파일 이름은 대/소문자를 구분합니다.

    • 스테이지 이름은 대/소문자를 구분하지 않습니다.

  • PACKAGES 절을 사용하여 Snowflake 시스템 정의 종속성에 대한 패키지 이름과 버전 번호(예: Snowpark의 패키지 이름과 버전 번호)를 지정할 수 있습니다. 다른 종속 항목의 경우 IMPORTS 절을 사용하여 종속 항목 JAR 파일을 지정합니다.

  • Snowflake는 다음의 유효성을 검사합니다.

    • CREATE FUNCTION 문의 HANDLER에 지정된 JAR 파일이 존재하고 이 파일에는 지정된 클래스와 메서드가 있습니다.

    • UDF 선언에 지정된 입력 및 출력 유형은 Scala 메서드의 입력 및 출력 유형과 호환됩니다.

    유효성 검사는 활동 중인 Snowflake 웨어하우스에 연결되어 있는지 여부에 따라 생성 시 또는 실행 시 수행할 수 있습니다.

    • 생성 시간 — CREATE FUNCTION 문이 실행될 때 활성 상태인 Snowflake 웨어하우스에 연결되어 있으면 UDF 는 생성 시점에 유효성이 검사됩니다.

    • 실행 시간 — 활동 중인 Snowflake 웨어하우스에 연결되어 있지 않은 경우 UDF 가 생성되지만 즉시 유효성이 검사되지 않으며, Snowflake는 다음 메시지를 반환합니다.

      Function <이름> created successfully, but could not be validated since there is no active warehouse

SQL

  • 현재, NOT NULL 절은 SQL UDF에 대해 적용되지 않습니다.

SQL로 UDF 만들기

다음 단계를 사용하여 SQL 로 UDF 를 만들 수 있습니다.

CREATE FUNCTION 문을 사용하여 처리기 메서드를 UDF 이름과 연결하기

다음 단계에 따라 UDF를 만듭니다.

  1. UDF가 호출될 때 실행되는 처리기 코드를 작성합니다.

    지원되는 처리기 언어 중 하나를 사용할 수 있습니다. 자세한 내용은 지원 언어 및 도구 섹션을 참조하십시오.

  2. 처리기 코드를 CREATE FUNCTION SQL 문과 인라인으로 유지할지, 아니면 스테이지에서 참조할지 선택합니다.

    각각 나름의 장점이 있습니다. 자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.

  3. 함수의 속성을 지정하여 SQL에서 CREATE FUNCTION 문을 실행합니다.

    다음 예제의 코드는 인라인 처리기 HandlerClass.handlerMethod 를 사용하는 function_name 라는 UDF를 생성합니다.

    create function function_name(x integer, y integer)
      returns integer
      language java
      handler='HandlerClass.handlerMethod'
      target_path='@~/HandlerCode.jar'
      as
      $$
          class HandlerClass {
              public static int handlerMethod(int x, int y) {
                return x + y;
              }
          }
      $$;
    
    Copy

    다음은 함수를 만들 때 필요하거나 일반적으로 사용되는 몇 가지 속성에 대한 설명입니다.

    • 함수 이름.

      UDF 이름은 처리기의 이름과 일치할 필요가 없습니다. CREATE FUNCTION 문은 UDF 이름을 처리기와 연관시킵니다.

      이름 제약 조건과 규칙에 대한 자세한 내용은 프로시저와 UDF의 명명 및 오버로딩 섹션을 참조하십시오.

    • 함수 인자(있는 경우).

      UDF 및 저장 프로시저에 대한 인자 정의하기 섹션을 참조하십시오.

    • RETURNS 절이 있는 반환 유형입니다.

      스칼라 반환 값의 경우 RETURNS 절은 단일 반환 유형을 지정하고, 테이블 형식 반환 값의 경우 RETURNS는 테이블 형식 반환 값에서 열 유형을 지정하는 TABLE 키워드를 지정합니다.

      Snowflake가 SQL 데이터 타입을 처리기 데이터 타입에 매핑하는 방법에 대한 자세한 내용은 프로시저와 UDF의 명명 및 오버로딩 섹션을 참조하십시오.

    • HANDLER 절이 있는 처리기 이름입니다.

      필요한 경우 이는 UDF가 호출될 때 실행되는 코드를 포함하는 클래스 또는 메서드의 이름입니다. Java와 Python으로 작성된 처리기에 대해서만 처리기 이름을 지정해야 합니다. JavaScript 및 SQL 처리기의 경우 인라인으로 지정된 모든 코드가 처리기로 실행됩니다.

      다음 표에는 처리기 언어와 함수 유형에 따라 HANDLER 절의 값 형식을 설명합니다.

      처리기 언어

      UDF

      UDTF

      Java

      클래스 및 메서드 이름.

      예: MyClass.myMethod

      클래스 이름만. 처리기 메서드 이름은 필요한 인터페이스에 의해 미리 결정됩니다.

      JavaScript

      없습니다.

      없습니다.

      Python

      클래스가 사용되는 경우 클래스 및 메서드 이름이며, 그렇지 않으면 함수 이름.

      예: module.my_function 또는 my_function

      클래스 이름만. 처리기 메서드 이름은 필요한 인터페이스에 의해 미리 결정됩니다.

      SQL

      없습니다.

      없습니다.

    • IMPORTS 또는 PACKAGES 절을 사용하여 처리기에 필요한 종속 항목(있는 경우).

      처리기에서 종속 항목을 사용할 수 있도록 만드는 방법에 대한 자세한 내용은 코드에 종속성을 사용할 수 있도록 만들기 섹션을 참조하십시오.

    • RUNTIME_VERSION 절이 있는 처리기 언어 런타임.

      처리기 언어가 Java 또는 Python인 경우 RUNTIME_VERSION 절을 사용하여 지원되는 런타임 버전 중 어떤 버전을 사용할지 지정합니다. 이 절을 생략하면 Snowflake가 기본값을 사용하게 되며 이는 나중에 변경할 수 있습니다.