Python UDF ์†Œ๊ฐœยถ

Python์—์„œ UDF(์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜)์˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ํ•ญ๋ชฉ์—์„œ๋Š” Python ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ๋„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UDF ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด ๋ชฉ๋ก์„ ํฌํ•จํ•˜์—ฌ, UDF์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๊ฐœ์š” ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด SQL๋กœ UDF๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. SQL์„ ์‚ฌ์šฉํ•˜์—ฌ UDF์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ ๋˜๋Š” UDF ์‹คํ–‰ํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Snowflake๋Š” ํ˜„์žฌ ๋‹ค์Œ Python ๋ฒ„์ „์—์„œ UDF ์ž‘์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • 3.9

  • 3.10

  • 3.11

  • 3.12

์ฐธ๊ณ 

Python UDF ์ฒ˜๋ฆฌ๊ธฐ์™€ ๊ด€๋ จ๋œ ์ œํ•œ ์‚ฌํ•ญ์€ Python UDF ์ œํ•œ ์‚ฌํ•ญ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ:

Python ์ฒ˜๋ฆฌ๊ธฐ ์ž‘๋™ ๋ฐฉ์‹ยถ

์‚ฌ์šฉ์ž๋Š” UDF๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ UDF์˜ ์ด๋ฆ„๊ณผ ์ธ์ž๋ฅผ Snowflake์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Snowflake๋Š” UDF์˜ ๋…ผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ จ ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ(์ธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ์ž๋„ ํฌํ•จ)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๋Š” ์ถœ๋ ฅ์„ Snowflake๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  Snowflake๋Š” ์ด๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

UDF์— ์ „๋‹ฌ๋œ ๊ฐ ํ–‰์— ๋Œ€ํ•ด UDF๋Š” ์Šค์นผ๋ผ(์ฆ‰, ๋‹จ์ผ) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ” ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ๊ฒฝ์šฐ ํ–‰ ์„ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Python UDF๋Š” ์ƒˆ ์ฝ”๋“œ์™€ ๊ธฐ์กด ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋‘˜ ๋‹ค ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ์—ฐ์„ฑ๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฏธ Python์— ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ Python UDF ์ฒ˜๋ฆฌ๊ธฐ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆยถ

๋‹ค์Œ ์˜ˆ์ œ์˜ ์ฝ”๋“œ๋Š” ์ฒ˜๋ฆฌ๊ธฐ ๋ฉ”์„œ๋“œ addone_py ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ addone ์ด๋ผ๋Š” UDF๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Snowflake๋Š” SQL-Python ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋งคํ•‘ ์— ์„ค๋ช…๋œ ๋งคํ•‘์— ๋”ฐ๋ผ Python ์ธ์ž ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ SQL๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CREATE OR REPLACE FUNCTION addone(i INT)
  RETURNS INT
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.9'
  HANDLER = 'addone_py'
AS $$
def addone_py(i):
  return i+1
$$;
Copy

์„ค๊ณ„ ๊ณ ๋ ค ์‚ฌํ•ญยถ

์œ ์šฉํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค.

์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋”ฉยถ

๊ธฐ๋ณธ ์‚ฌํ•ญ๋ถ€ํ„ฐ ์ž์„ธํ•œ ์˜ˆ์ œ๊นŒ์ง€, ๋‹ค์Œ ํ•ญ๋ชฉ์—์„œ๋Š” UDF ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ Python์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • Python ๋ชจ๋“ˆ ์ •์˜. Python ๋ชจ๋“ˆ์—์„œ UDF์˜ ๋…ผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. Snowflake๊ฐ€ ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ชจ๋“ˆ ์„ค๊ณ„ํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ. Snowflake๊ฐ€ ์ฒ˜๋ฆฌ๊ธฐ์—์„œ ์ƒ์„ฑ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ˜ํ™˜ ๊ฐ’. UDF์—์„œ ์Šค์นผ๋ผ(๋‹จ์ผ) ๊ฐ’๋ฟ ์•„๋‹ˆ๋ผ ํ…Œ์ด๋ธ” ํ˜•์‹ ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ํ˜•์‹ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Python์œผ๋กœ UDTF ์ž‘์„ฑํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ๋กœ๊น… ๋ฐ ์ด๋ฒคํŠธ ์ถ”์ . ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋กœ๊ทธ ๋ฐ ์ถ”์  ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๊น…, ์ถ”์  ๋ฐ ๋ฉ”ํŠธ๋ฆญ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์ข…์†์„ฑ. ์Šคํ…Œ์ด์ง€์— ์ข…์†์„ฑ์„ ์—…๋กœ๋“œํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ์— ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์ฝ”๋“œ ์˜ˆ์ œ Python์˜ ๋‹ค์–‘ํ•œ ์ฒ˜๋ฆฌ๊ธฐ ์˜ˆ์ œ๋Š” Python UDF ์ฒ˜๋ฆฌ๊ธฐ ์˜ˆ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.