์ผ๋ฐ Scala UDF ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ฉ ์ง์นจยถ
์ด ํญ๋ชฉ์์๋ Scala์์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ผ๋ฐ์ ์ธ ์ง์นจ์ ์ค๋ช ํฉ๋๋ค. ์ค์นผ๋ผ ํจ์ ์ฒ๋ฆฌ๊ธฐ์ ๊ด๋ จ๋ ์ ๋ณด๋ Scala๋ก ์ค์นผ๋ผ UDF ์์ฑํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํ๋ก์ ํธ ๊ตฌ์กฐํ, ์ฝ๋ ํจํค์ง, ์ข ์์ฑ ๊ด๋ฆฌ์ ๋ํ ์ ์ ์ฌํญ์ Scala UDF ์ฒ๋ฆฌ๊ธฐ ํ๋ก์ ํธ ๋ฐ ํจํค์ง ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ชจ๋ฒ ์ฌ๋กยถ
ํ๋ซํผ ๋ ๋ฆฝ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ์ญ์์ค.
ํน์ CPU ์ํคํ ์ฒ(์: x86)๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋๋ฅผ ํผํ์ญ์์ค.
ํน์ ์ด์ ์ฒด์ ๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋๋ฅผ ํผํ์ญ์์ค.
์ด๊ธฐํ ์ฝ๋๋ฅผ ์คํํด์ผ ํ์ง๋ง, ํธ์ถํ๋ ๋ฉ์๋์ ์ด๋ฅผ ํฌํจํ์ง ์์ผ๋ ค๋ฉด ์ด๊ธฐํ ์ฝ๋๋ฅผ ์ฒ๋ฆฌ๊ธฐ ํด๋์ค์ ์ปดํจ๋์ธ ์ค๋ธ์ ํธ์ ๋ฃ์ ์ ์์ต๋๋ค.
์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ๋ฅํ๋ฉด CREATE FUNCTION ๋๋ CREATE PROCEDURE TARGET_PATH ๋งค๊ฐ ๋ณ์์ ๊ฐ์ ์ง์ ํ์ญ์์ค. ๊ทธ๋ฌ๋ฉด ํธ์ถํ ๋๋ง๋ค ๋ค์ ์ปดํ์ผํ๋ ๋์ ์ด์ ์ ์์ฑ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ ์ถ๋ ฅ์ ์ฌ์ฌ์ฉํ๋๋ก Snowflake์ ์๋ ค์ฃผ๊ฒ ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฒ๋ฆฌ๊ธฐ ์์ฑํ๊ธฐยถ
Scala๋ก ์์ฑ๋ ์ฒ๋ฆฌ๊ธฐ๋ก ์ค์นผ๋ผ UDF๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ฒ๋ฆฌ๊ธฐ๋ Scala UDF์ ์ ๋ฌ๋ ๊ฐ ํ์ ๋ํด ํ ๋ฒ ํธ์ถ๋ฉ๋๋ค. ํด๋์ค์ ์ ์ธ์คํด์ค๋ ๊ฐ ํ์ ๋ํด ๋ง๋ค์ด์ง์ง ์์ต๋๋ค. Snowflake๋ ๋์ผํ ์ธ์คํด์ค์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ ์ ์์ต๋๋ค.
์ฝ๋ ์คํ์ ์ต์ ํํ๊ธฐ ์ํด, Snowflake ์ ํ ์๊ฐ ์๊ณ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ ํด๋์ค ๋๋ ์ค๋ธ์ ํธ๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ์คํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋ค๋ฆ ๋๋ค. Snowflake์์๋ ์ด๊ธฐํ๊ฐ ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค๋ ๊ฐ์ ํ์ ์ฒ๋ฆฌ๊ธฐ ํด๋์ค ๋๋ ์ค๋ธ์ ํธ๋ฅผ ์ด๊ธฐํํ ์๊ฐ์ ๋ ๋ง์ด ํ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ UDF๋ฅผ ๋ก๋ํ๋ ์๊ฐ, ๊ทธ๋ฆฌ๊ณ ์์ฑ์๊ฐ ์ ์๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์ ํฌํจ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ๋ ์๊ฐ์ด ํฌํจ๋ฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌยถ
์ผ๋ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ ๊ธฐ์ ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ๋ด์์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค.
๋ฉ์๋ ๋ด์์ ์์ธ๊ฐ ๋ฐ์ํ๊ณ ์ด ์์ธ๊ฐ ๋ฉ์๋์์ ํฌ์ฐฉ๋์ง ์์ผ๋ฉด Snowflake๋ ์์ธ์ ๋ํ ์คํ ์ถ์ ์ ํฌํจํ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ๊ณ SQL ์ค๋ฅ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์์ธ๋ฅผ ํฌ์ฐฉํ์ง ์๊ณ ๋ช ์์ ์ผ๋ก ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ์:
if (x < 0) throw new IllegalArgumentException("x must be non-negative.")
๋๋ฒ๊น ํ ๋ SQL ์ค๋ฅ ๋ฉ์์ง ํ ์คํธ์ ๊ฐ์ ํฌํจํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
์ ์ฒด Scala ๋ฉ์๋ ๋ณธ๋ฌธ์ try-catch ๋ธ๋ก์ ๋ฃ์ต๋๋ค.
ํฌ์ฐฉ๋ ์ค๋ฅ ๋ฉ์์ง์ ์ธ์ ๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
ํ์ฅ ๋ฉ์์ง์ ํจ๊ป ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋์ง ์๋๋ก ํ๋ ค๋ฉด JAR ํ์ผ์ ํ๋ก๋์ ํ๊ฒฝ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ธ์ ๊ฐ์ ์ ๊ฑฐํ์ญ์์ค.
๋ฐ์ดํฐ ํ์ ์ ํํ๊ธฐยถ
์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ๋ UDF์ ๋งค๊ฐ ๋ณ์ ๋ฐ ๋ฐํ ๋ฐ์ดํฐ ํ์ (SQL์์)๊ณผ ์ ๋งคํ๋๋ ๋งค๊ฐ ๋ณ์ ๋ฐ ๋ฐํ ๋ฐ์ดํฐ ํ์ (์ฒ๋ฆฌ๊ธฐ ์ธ์ด์์)์ ์ ์ธํด์ผ ํฉ๋๋ค.
UDF๊ฐ ํธ์ถ๋ ๋ Snowflake๋ UDF์ ์ธ์๋ฅผ SQL ๋งค๊ฐ ๋ณ์ ์ ํ์์ ์ฒ๋ฆฌ๊ธฐ์ ๋งค๊ฐ ๋ณ์ ์ ํ์ผ๋ก ๋ณํํฉ๋๋ค. ๊ฐ์ ๋ฐํํ ๋ Snowflake๋ ๋ฐํ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ฐํ ์ ํ์์ UDF์ ๋ฐํ ์ ํ์ผ๋ก ๋ณํํฉ๋๋ค.
Snowflake๋ SQL ์ ํ๊ณผ Scala ์ ํ ๊ฐ์ ์ง์๋๋ ๋งคํ์ ๋ฐ๋ผ ์ ํ ๊ฐ์ ๊ฐ์ ๋ณํํฉ๋๋ค. ์ด๋ฌํ ๋งคํ์ ๋ํ ์์ธํ ๋ด์ฉ์ SQL-Scala ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Scala ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ ์ ํํ ๋ Snowflake์์ ์ ์ก(๋ฐ ๋ฐํ)๋ ์ ์๋ ๋ฐ์ดํฐ์ ๊ฐ๋ฅํ ์ต๋๊ฐ ๋ฐ ์ต์๊ฐ์ ๊ณ ๋ คํ์ญ์์ค.
CREATE FUNCTION
์ผ๋ก UDF ๋ง๋ค๊ธฐยถ
CREATE FUNCTION ๋ช ๋ น์ ์ฌ์ฉํ์ฌ SQL๋ก UDF๋ฅผ ๋ง๋ค์ด ์์ฑํ ์ฝ๋๋ฅผ ํธ๋ค๋ฌ๋ก ์ง์ ํฉ๋๋ค. ๋ช ๋ น ์ฐธ์กฐ๋ CREATE FUNCTION ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE OR REPLACE FUNCTION <name> ( [ <arguments> ] )
RETURNS <type>
LANGUAGE SCALA
[ IMPORTS = ( '<imports>' ) ]
RUNTIME_VERSION = 2.12
[ PACKAGES = ( '<package_name>' [, '<package_name>' . . .] ) ]
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
HANDLER = '<handler_class>.<handler_method>'
[ AS '<scala_code>' ]
์์ฑํ ํธ๋ค๋ฌ ์ฝ๋๋ฅผ UDF์ ์ฐ๊ฒฐํ๋ ค๋ฉด CREATE FUNCTION ์คํ ์ ๋ค์์ ์ํํ์ญ์์ค.
LANGUAGE๋ฅผ SCALA์ผ๋ก ์ค์ ํฉ๋๋ค.
ํธ๋ค๋ฌ ํด๋์ค๊ฐ ์คํ ์ด์ง์ ๊ฐ์ ์ธ๋ถ ์์น์ ์๋ ๊ฒฝ์ฐ IMPORTS ์ ๊ฐ์ ํธ๋ค๋ฌ ํด๋์ค์ ๊ฒฝ๋ก์ ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค.
RUNTIME_VERSION์ ์ฝ๋์์ ํ์ํ Scala ๋ฐํ์ ๋ฒ์ ์ผ๋ก ์ค์ ํฉ๋๋ค.
PACKAGES ์ ๊ฐ์ ํธ๋ค๋ฌ ํด๋์ค์ ํ์ํ ํ๋ ์ด์์ ํจํค์ง(์๋ ๊ฒฝ์ฐ)์ ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค.
HANDLER ์ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ ์ค๋ธ์ ํธ์ ๋ฉ์๋์ ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ CREATE FUNCTION๊ณผ ํจ๊ป ์ธ๋ผ์ธ์ผ๋ก ์ง์ ๋ ๊ฒฝ์ฐ
AS '<scala_code>'
์ ์ด ํ์ํฉ๋๋ค.