์ค์นผ๋ผ Scala UDFs์์ ์ ์ญ ์ํ ์ ์ดํ๊ธฐยถ
๊ณต์ ์ํ์ ๋ํ ์ก์ธ์ค๊ฐ ํ์ํ UDF์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค๊ณํ ๋ Snowflake๊ฐ UDF๋ฅผ ์คํํ์ฌ ํ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ค๋ช ํด์ผ ํฉ๋๋ค.
๋๋ถ๋ถ์ ์ฒ๋ฆฌ๊ธฐ๋ ๋ค์ ์ง์นจ์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
ํ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ๊ณต์ ์ํ๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ธฐ ํจ์ ์ธ๋ถ์์(์: ์์ฑ์์์) ์ด๊ธฐํํ์ญ์์ค.
์ค๋ ๋๋ก๋ถํฐ ์์ ํ๋๋ก ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ์์ฑํ์ญ์์ค.
ํ ๊ฐ์ ๋์ ์ํ๋ฅผ ์ ์ฅ ๋ฐ ๊ณต์ ํ์ง ๋ง์ญ์์ค.
UDF๊ฐ ์ด๋ฌํ ์ง์นจ์ ๋ฐ๋ฅผ ์ ์๊ฑฐ๋ ์ด๋ฌํ ์ง์นจ์ ์ด์ ๋ฅผ ๋ ๊น์ด ์ดํดํ๋ ค๋ ๊ฒฝ์ฐ, ๋ค์ ๋ช ๊ฐ์ง ํ์ ์น์ ์ ์ฝ์ผ์ญ์์ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ ์ดํดํ๊ธฐยถ
์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด Snowflake๋ JVM ์ ์ฒด์ ๊ฑธ์ณ, ๊ทธ๋ฆฌ๊ณ JVM ๋ด์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
JVMs ์ ์ฒด์ ๊ฑธ์ณ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๊ธฐยถ
Snowflake๋ ์จ์ดํ์ฐ์ค ์ ์์ ์ ์ ์ฒด์ ๊ฑธ์ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค. ๊ฐ ์์ ์๋ ํ๋ ์ด์์ JVM์ ์คํํฉ๋๋ค. ์ด๋ ์ ์ญ ๊ณต์ ์ํ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ๊ธฐ๊ปํด์ผ ๋จ์ผ JVM ๋ด์์๋ง ์ํ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
JVMs ๋ด์์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๊ธฐยถ
๊ฐ JVM์ ๋์ผํ ์ธ์คํด์ค์ ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ๋ณ๋ ฌ๋ก ํธ์ถํ ์ ์๋ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ ํธ๋ค๋ฌ ๋ฉ์๋๊ฐ ์ค๋ ๋๋ก๋ถํฐ ์์ ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
UDF๊ฐ IMMUTABLE์ด๊ณ SQL ๋ฌธ์ด ๋์ผ ํ์ ๋ํด ๋์ผ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ UDF๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ๋ ๊ฒฝ์ฐ, UDF๋ ํด๋น ํ์ ๊ฐ ํธ์ถ์ ๋ํด ๋์ผ ๊ฐ์ ๋ฐํํฉ๋๋ค.
์๋ฅผ ๋ค์ด, UDF๊ฐ IMMUTABLE์ธ ๊ฒฝ์ฐ ๋ค์์ ๊ฐ ํ์ ๋ํด ๋์ผ ๊ฐ์ ๋ ๋ฒ ๋ฐํํฉ๋๋ค.
SELECT my_scala_udf(42), my_scala_udf(42) FROM table1;
๋์ผ ์ธ์๊ฐ ์ ๋ฌ๋ ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ ํธ์ถ์ด ๋ ๋ฆฝ ๊ฐ์ ๋ฐํํ๊ณ ํจ์ VOLATILE์ ์ ์ธํ์ง ์์ผ๋ ค๋ฉด ์ฌ๋ฌ ๊ฐ๋ณ UDF๋ฅผ ๋์ผ ํธ๋ค๋ฌ ๋ฉ์๋์ ๋ฐ์ธ๋ฉํ์ญ์์ค.
๋ค์ ๋จ๊ณ์ ๋ฐ๋ผ ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ
@udf_libs/rand.jar
๋ผ๋ JAR ํ์ผ์ ๋ง๋ญ๋๋ค.class MyClass { var x: Double = 0.0 // Constructor def this() = { x = Math.random() } // Handler def myHandler(): Double = x }
์๋์ ๊ฐ์ด Scala UDF๋ฅผ ๋ง๋ญ๋๋ค.
์ด๋ฌํ UDF๋ ์ด๋ฆ์ด ๋ค๋ฅด์ง๋ง, ๋์ผ JAR ํ์ผ์ ์ฌ์ฉํ๋ฉฐ, ํด๋น JAR ํ์ผ ๋ด์์ ๋์ผ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CREATE FUNCTION my_scala_udf_1() RETURNS DOUBLE LANGUAGE SCALA IMPORTS = ('@udf_libs/rand.jar') HANDLER = 'MyClass.myHandler'; CREATE FUNCTION my_scala_udf_2() RETURNS DOUBLE LANGUAGE SCALA IMPORTS = ('@udf_libs/rand.jar') HANDLER = 'MyClass.myHandler';
๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ UDF๋ฅผ ๋ชจ๋ ํธ์ถํฉ๋๋ค.
UDF๋ ๋์ผํ JAR ํ์ผ ๋ฐ ํธ๋ค๋ฌ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์ด๋ฌํ ํธ์ถ์ ๋์ผํ ํด๋์ค์ ๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ๊ฐ ์ธ์คํด์ค๋ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ๋ฐํํ๋ฏ๋ก ์๋ ์์์๋ ๋์ผ ๊ฐ์ ๋ ๋ฒ ๋ฐํํ๋ ๋์ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ๋ฐํํฉ๋๋ค.
SELECT my_scala_udf_1(), my_scala_udf_2() FROM table1;
JVM ์ํ ์ ๋ณด ์ ์ฅํ๊ธฐยถ
๋์ ๊ณต์ ์ํ์ ์์กดํ์ง ์๋ ํ ๊ฐ์ง ์ด์ ๋ ํ์ด ๋ฐ๋์ ์์ธก ๊ฐ๋ฅํ ์์๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค. SQL ๋ฌธ์ด ์คํ๋ ๋๋ง๋ค Snowflake๋ ๋ฐฐ์น ์, ๋ฐฐ์น๊ฐ ์ฒ๋ฆฌ๋๋ ์์, ๋ฐฐ์น ๋ด์ ํ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ํ ํ์ด ํ์ ํ์ ๋ฐํ ๊ฐ์ ์ํฅ์ ๋ฏธ์น๋๋ก ์ค์นผ๋ผ UDF๊ฐ ์ค๊ณ๋ ๊ฒฝ์ฐ, UDF๋ UDF๊ฐ ์คํ๋ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.