[Snowflake] UDFs & External Functions

차지예·2026년 5월 7일

Snowflake

목록 보기
8/49
post-thumbnail

1. User Defined Functions (UDFs) 개요

UDF는 스키마 레벨 객체(schema-level objects)로, 사용자가 직접 함수를 작성할 수 있다.

지원 언어 (4가지)

  • SQL
  • JavaScript
  • Python
  • Java

핵심 특징

  • 파라미터 0개 이상 허용
  • 스칼라(scalar) 또는 테이블형(tabular) 결과 반환 가능 → 테이블형 반환 시 UDTF(User Defined Table Function)
  • SQL 문의 일부로 호출 가능 (SELECT 문 내 사용)
  • 오버로딩(overloading) 가능

2. JavaScript UDF

CREATE FUNCTION JS_FACTORIAL(d double)
    RETURNS DOUBLE
    LANGUAGE JAVASCRIPT
    AS
    $$
    if (D <= 0) {
        return 1
    } else {
        var result = 1;
        for (var i = 2; i <= D; i++) {
            result = result * i;
        }
        return result;
    }
    $$;

특징

항목내용
언어 지정LANGUAGE JAVASCRIPT 파라미터로 지정
기능고수준 프로그래밍 언어 기능 사용 가능
재귀JavaScript UDF는 재귀 호출 가능
타입 매핑Snowflake 데이터 타입 → JavaScript 데이터 타입으로 매핑됨

3. Java UDF

CREATE FUNCTION DOUBLE(X INTEGER)
    RETURNS INTEGER
    LANGUAGE JAVA
    HANDLER='TestDoubleFunc.double'
    TARGET_PATH='@~/TestDoubleFunc.jar'
    AS
    $$
    class TestDoubleFunc {
        public static int double(int x) {
            return x * 2;
        }
    }
    $$;

특징

항목내용
실행 방식Snowflake가 JVM을 부팅하여 Java 함수 실행
지원 버전Java 8.x, 9.x, 10.x, 11.x
코드 방식인라인 코드 또는 사전 컴파일된 .jar 파일 모두 지정 가능
주요 파라미터HANDLER (클래스.메서드명), TARGET_PATH (.jar 파일 경로)

4. External Functions

CREATE OR REPLACE EXTERNAL FUNCTION CALC_SENTIMENT(STRING_COL VARCHAR)
    RETURNS VARIANT
    API_INTEGRATION = AWS_API_INTEGRATION
    AS 'https://ttu.execute-api.eu-west-2.amazonaws.com/';

구문 구성 요소

구문 요소설명
함수명 + 파라미터CALC_SENTIMENT(STRING_COL VARCHAR)
반환 타입RETURNS VARIANT
Integration 객체API_INTEGRATION = AWS_API_INTEGRATION
URL Proxy 서비스AWS API Gateway URL

API Integration 설정 예시

CREATE OR REPLACE API INTEGRATION AWS_API_INTEGRATION
    API_PROVIDER = AWS_API_GATEWAY
    API_AWS_ROLE_ARN = 'ARN:AWS:IAM::123456789012:ROLE/MY_CLOUD_ACCOUNT_ROLE'
    API_ALLOWED_PREFIXES = ('HTTPS://XYZ.EXECUTE-API.US-WEST-2.AMAZONAWS.COM/PRODUCTION')
    ENABLED = TRUE;

5. External Function Call Lifecycle

Client Program → Snowflake → HTTPS Proxy Service → HTTPS Proxy Service
(SnowUI, SnowSQL, Python...)

호출 흐름

  1. 클라이언트가 SELECT CALC_SENTIMENT('x') FROM MY_TABLE; 실행
  2. Snowflake의 External Function 처리
  3. API Integration 참조
  4. HTTP POST request → AWS API Gateway
  5. AWS API Gateway → HTTP POST request → AWS Lambda
  6. AWS Lambda → HTTP response → AWS API Gateway
  7. AWS API Gateway → HTTP response → Snowflake
  8. Snowflake → 결과 반환 → Client

6. External Function 제한사항 (Limitations)

제한사항설명
Slower외부 호출로 인해 UDF보다 느림
Scalar only스칼라 결과만 반환 가능 (UDTF 불가)
Not sharable다른 계정과 공유 불가
Less secure데이터가 Snowflake 외부로 전송되므로 보안이 상대적으로 낮음
Egress charges데이터 외부 전송에 따른 추가 비용 발생

⚠️ 주의 포인트

  • UDF는 오버로딩 가능, External Function은 불가
  • Java UDF는 인라인 코드 또는 .jar 파일 둘 다 사용 가능
  • External Function은 Scalar only — 테이블 반환 불가
  • Java 지원 버전: 8.x, 9.x, 10.x, 11.x (범위 암기)
  • External Function은 API Integration 객체가 반드시 필요

0개의 댓글