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...)
호출 흐름
- 클라이언트가
SELECT CALC_SENTIMENT('x') FROM MY_TABLE; 실행
- Snowflake의 External Function 처리
- API Integration 참조
- HTTP POST request → AWS API Gateway
- AWS API Gateway → HTTP POST request → AWS Lambda
- AWS Lambda → HTTP response → AWS API Gateway
- AWS API Gateway → HTTP response → Snowflake
- 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 객체가 반드시 필요