์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐยถ

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์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„๋“œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • OR REPLACE ๋ฐ IF NOT EXISTS ์ ˆ์€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฌธ์ž๋ฅผ ๊ฐ™์€ ๋ฌธ์— ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • 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๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ ์ด๋Š” ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.