Scala UDF ์๊ฐยถ
Scala์์ UDF(์ฌ์ฉ์ ์ ์ ํจ์)์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฒ๋ฆฌ๊ธฐ๋ SQL์์ ํธ์ถ๋ ๋ ํจ์์ ๋ ผ๋ฆฌ๋ก ์คํ๋ฉ๋๋ค.
Snowflake๋ ํ์ฌ ๋ค์ Scala ๋ฒ์ ์์ UDF ์์ฑ์ ์ง์ํฉ๋๋ค.
2.12
์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ผ๋ฉด SQL๋ก UDF๋ฅผ ์์ฑํฉ๋๋ค. SQL์ ์ฌ์ฉํ์ฌ UDF์ ๋ง๋ค๊ฑฐ๋ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ์ฉ์ ์ ์ ํจ์ ์์ฑํ๊ธฐ ๋๋ UDF ์คํํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
UDF ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ์ ์๋ ์ธ์ด ๋ชฉ๋ก์ ํฌํจํ์ฌ, UDF์ ๋ํ ์๊ฐ๋ ์ฌ์ฉ์ ์ ์ ํจ์ ๊ฐ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
Scala ์ฒ๋ฆฌ๊ธฐ์ ๊ด๋ จ๋ ์ ํ ์ฌํญ์ Scala UDF ์ ํ ์ฌํญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Snowpark API๋ฅผ ์ฌ์ฉํ ๋ Scala๋ฅผ ์ฌ์ฉํ์ฌ UDF๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Scala์์ DataFrame์ฉ ์ฌ์ฉ์ ์ ์ ํจ์(UDF) ๋ง๋ค๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฒ๋ฆฌ๊ธฐ ์๋ ๋ฐฉ์ยถ
์ฌ์ฉ์๋ UDF๋ฅผ ํธ์ถํ ๋ UDF์ ์ด๋ฆ๊ณผ ์ธ์๋ฅผ Snowflake์ ์ ๋ฌํฉ๋๋ค. Snowflake๋ UDF์ ์ฐ๊ฒฐ๋ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ UDF์ ๋ ผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํธ๋ค๋ฌ ๋ฉ์๋๋ ์ถ๋ ฅ์ Snowflake๋ก ๋ฐํํ๊ณ Snowflake๋ ์ด๋ฅผ ๋ค์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํฉ๋๋ค.
์ค์นผ๋ผ ํจ์(๋จ์ผ ๊ฐ์ ๋ฐํํ๋ ํจ์)์ ๊ฒฝ์ฐ UDF๋ UDF์ ์ ๋ฌ๋๋ ๊ฐ ํ์ ๋ํด ๋จ์ผ ๊ฐ์ ๋ฐํํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ์ ๋ ผ๋ฆฌ๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ฝ๋๋ ์ฒ๋ฆฌ๊ธฐ ์ธ๋ถ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Scala์ ๋ฐ์ดํฐ ๋ถ์ ์ฝ๋๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ์ ๋๋ค.
Scala์์ ์ฒ๋ฆฌ๊ธฐ ์์ฑ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ ์ผ๋ฐ Scala UDF ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ฉ ์ง์นจ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค. ์ค์นผ๋ผ ํจ์ ์์ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ Scala๋ก ์ค์นผ๋ผ UDF ์์ฑํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ยถ
๋ค์ ์์ ์ ์ฝ๋๋ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ TestFunc.echoVarchar
๋ฅผ ์ฌ์ฉํ์ฌ echo_varchar
์ด๋ผ๋ UDF๋ฅผ ์์ฑํฉ๋๋ค. Snowflake๋ SQL-Scala ๋ฐ์ดํฐ ํ์
๋งคํ ์ ์ค๋ช
๋ ๋งคํ์ ๋ฐ๋ผ Scala ์ธ์ ๋ฐ ๋ฐํ ์ ํ์ SQL๋ก ๋ณํํ๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํฉ๋๋ค.
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER='TestFunc.echoVarchar'
AS
$$
class TestFunc {
def echoVarchar(x : String): String = {
return x
}
}
$$;
UDF ํธ์ถํ๊ธฐยถ
SELECT echo_varchar('Hello');
์ค๊ณ ๊ณ ๋ ค ์ฌํญยถ
์ ์ฉํ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค๊ณํ๋ ค๋ฉด ๋ค์ ์ฌํญ์ ์ผ๋์ ๋์ญ์์ค.
์ผ๋ฐ ๊ณ ๋ ค ์ฌํญ. UDF์ ํ๋ก์์ ์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ณ ๋ ค ์ฌํญ์ ํจ์์ ํ๋ก์์ ์ ์ค๊ณ ์ง์นจ ๋ฐ ์ ์ฝ ์กฐ๊ฑด ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Snowflake์์ ๋ถ๊ณผํ ์ ์ฝ ์กฐ๊ฑด ์ค์. Snowflake์์ ์ ์คํ๋๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ Snowflake์์ ์ ์ฉํ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ์ ์ง๋๋ ์ฒ๋ฆฌ๊ธฐ ์ค๊ณํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
SQL-Scala ์ ํ ๋งคํ. UDF๋ก ์ธ์ ๋ฐ ๋ฐํ ๊ฐ์ ๊ตํํ ๋ Snowflake๋ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด์ SQL ์ฌ์ด์์ ์ ํํฉ๋๋ค. ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์ ๋ฐ์ดํฐ ํ์ ์ ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ SQL-Scala ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฝ๋ ํจํค์ง. ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ CREATE FUNCTION ๋ฌธ๊ณผ ํจ๊ป ์ธ๋ผ์ธ์ผ๋ก ์ฌ์ฉํ๊ฑฐ๋ ์คํ ์ด์ง์์ JAR๋ก ์ปดํ์ผ๋ ์ฝ๋๋ก ์ฌ์ฉํ๋๋ก ํ ์ ์์ต๋๋ค. ์ฐจ์ด์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง์ ์ ์งํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
sbt๋ฅผ ์ฌ์ฉํ์ฌ Scala ์ฒ๋ฆฌ๊ธฐ์ฉ์ผ๋ก ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ํจํค์งํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ sbt๋ก Scala ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ ํจํค์งํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฝ๋ ์ต์ ํ. ์ฝ๋๊ฐ ์ฌ๋ฌ ํ์์ ๊ณต์ ๋๋ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด, ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ ์ต์ ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ค์นผ๋ผ Scala UDFs์์ ์ ์ญ ์ํ ์ ์ดํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ชจ๋ฒ ์ฌ๋ก. ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ UDF ๋ฐ ํ๋ก์์ ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋ฉยถ
๊ธฐ๋ณธ ์ฌํญ๋ถํฐ ์์ธํ ์์ ๊น์ง, ๋ค์ ํญ๋ชฉ์์๋ UDF ์ฒ๋ฆฌ๊ธฐ๋ฅผ Scala๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ผ๋ฐ ์ง์นจ. ์ค๋ฅ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ํ์ ์ ํ ๋ฑ์ ๋น๋กฏํ์ฌ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ฉ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ ์ผ๋ฐ Scala UDF ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ฉ ์ง์นจ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ค์นผ๋ผ ํจ์ ์์ฑํ๊ธฐ ์์ธํ ๋ด์ฉ์ Scala๋ก ์ค์นผ๋ผ UDF ์์ฑํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ก๊น ๋ฐ ์ด๋ฒคํธ ์ถ์ . ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์คํ๋ ๋ ๋ก๊ทธ ๋ฐ ์ถ์ ๋ฐ์ดํฐ๋ฅผ ์บก์ฒํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ก๊น , ์ถ์ ๋ฐ ๋ฉํธ๋ฆญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฝ๋ ์์ ๋ค์ํ ์ฒ๋ฆฌ๊ธฐ ์์ ๋ Scala UDF ์ฒ๋ฆฌ๊ธฐ์ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ข ์์ฑ. ์คํ ์ด์ง์ ์ข ์์ฑ์ ์ ๋ก๋ํ์ฌ ๋ฐํ์์ ์ฝ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฝ๋์ ์ข ์์ฑ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฒ๋ฆฌ๊ธฐ ํ์ผ ๊ตฌ์ฑ. ์ปดํ์ผ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์คํ ์ด์ง์ ๋ํ JAR ํ์ผ๋ก ํจํค์งํ๋ ค๋ ๊ฒฝ์ฐ Scala UDF ์ฒ๋ฆฌ๊ธฐ ํ๋ก์ ํธ ๋ฐ ํจํค์ง ์ ์ ์์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๊ณ ๋น๋ํ์ญ์์ค.