Scala๋ก ์ค์นผ๋ผ UDF ์์ฑํ๊ธฐยถ
Scala๋ก ์ค์นผ๋ผ UDF(์ฌ์ฉ์ ์ ์ ํจ์)๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. Scala ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ UDF ํธ์ถ ์ ์คํ๋ฉ๋๋ค. ์ด ํญ๋ชฉ์์๋ Scala๋ก ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ๊ณ UDF๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
UDF๋ ์ค์นผ๋ผ ๊ฒฐ๊ณผ(์ฆ, ์ฌ๋ฌ ํ์ด ์๋ ๋จ์ผ ๊ฐ)๋ฅผ ๋ฐํํ๋ ์ฌ์ฉ์ ์ ์ ํจ์์ ๋๋ค. UDF์ ๋ํ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ๋ด์ฉ์ ์ฌ์ฉ์ ์ ์ ํจ์ ๊ฐ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
UDF๋ฅผ ๋ง๋ค ๋ ๋ค์์ ์ํํฉ๋๋ค.
UDF๊ฐ ํธ์ถ๋ ๋ Snowflake๊ฐ ํธ์ถํ ๋ฉ์๋๋ก Scala ์ค๋ธ์ ํธ ๋๋ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ํธ๋ค๋ฌ ๊ตฌํํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE FUNCTION ๋ช ๋ น์ผ๋ก SQL๋ก ์์ฑ๋ UDF๋ฅผ ๋ง๋ค์ด ์ค๋ธ์ ํธ ๋๋ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌ๊ธฐ๋ก ์ง์ ํฉ๋๋ค. UDF๋ฅผ ๋ง๋ค ๋ ๋ค์์ ์ง์ ํฉ๋๋ค.
UDF ์ ๋ ฅ ๋งค๊ฐ ๋ณ์์ ๋ฐ์ดํฐ ํ์ .
UDF ๋ฐํ ๊ฐ์ ๋ฐ์ดํฐ ํ์ .
UDF ํธ์ถ ์ ํธ๋ค๋ฌ๋ก ์คํํ๋ ์ฝ๋.
์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ฑ๋๋ ์ธ์ด.
CREATE FUNCTION ๊ตฌ๋ฌธ์ ๋ํ ์์ธํ ๋ด์ฉ์ CREATE FUNCTION ์ผ๋ก UDF ๋ง๋ค๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
UDF ์คํํ๊ธฐ ์ ์ค๋ช ๋ ๋๋ก UDF๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
ํธ๋ค๋ฌ ๊ตฌํํ๊ธฐยถ
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ก ์ค๋ธ์ ํธ ๋๋ ํด๋์ค๋ฅผ ๊ตฌํํ์ฌ UDF ์ธ์ ๊ฐ์ UDF์ ๋ฐํ ๊ฐ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ๋ ๋ค์์ ์ํํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ๋ก ์ง์ ํ ๊ณต์ฉ ๋ฉ์๋๊ฐ ์๋ ๊ณต์ฉ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
์ด๊ฒ์ SQL์์ UDF๊ฐ ํธ์ถ๋ ๋ Snowflake๊ฐ ํธ์ถํ๋ ๋ฉ์๋๊ฐ ๋ฉ๋๋ค.
๋์ผํ ์ค๋ธ์ ํธ ๋๋ ํด๋์ค์์ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ํ ๋ค์ ๊ฐ๊ฐ์ ๋ค๋ฅธ UDF์ ๋ํ ์ฒ๋ฆฌ๊ธฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปดํ์ผ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์คํ ์ด์ง์ ์ ์งํ๊ณ ์ฌ๋ฌ ํจ์์์ ์ด ์ฝ๋๋ฅผ ์ฐธ์กฐํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ํ ์ ์์ต๋๋ค.
์คํ ์ด์ง๋ ์ฒ๋ฆฌ๊ธฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง์ ์ ์งํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ ํ์ ์ผ๋ก, Snowflake์์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํด ํธ์ถํ ์ธ์ ์๋ ์์ฑ์๋ฅผ ์์ฑํฉ๋๋ค.
์ฐธ๊ณ
๊ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํธ์ถํ๋ ๋ฉ์๋์์ Snowflake๊ฐ ๋ถ๊ณผํ๋ ์ ์ฝ ์กฐ๊ฑด์ ๋ง์ถฐ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํ ์์ธํ ๋ด์ฉ์ Snowflake์์ ์ ์ฉํ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ์ ์ง๋๋ ์ฒ๋ฆฌ๊ธฐ ์ค๊ณํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฒ๋ฆฌ๊ธฐ์ ์ยถ
๋ค์ ์์ ์ ์ฝ๋์๋ ๋ฌธ์์ด์ ์์ ํ๊ณ ๋ฐํํ๋ MyHandler.echoVarchar
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. Snowflake๋ UDF์์ ์์ ํ ๊ฐ(VARCHAR)์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์ ์ ํ์ธ ๋ฌธ์์ด์ ๋งคํํฉ๋๋ค.
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER='MyHandler.echoVarchar'
AS
$$
class MyHandler {
def echoVarchar(x : String): String = {
return x
}
}
$$;
UDF ํธ์ถํ๊ธฐ
SELECT echo_varchar('Hello');
์ฒ๋ฆฌ๊ธฐ ์ด๊ธฐํํ๊ธฐยถ
์ธ์ ์๋ ์์ฑ์๋ฅผ ์ถ๊ฐํ์ฌ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ํ์ ์ผ๋ก ์ด๊ธฐํํ ์ ์์ต๋๋ค.
์์ฑ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ์ด ์ค๋ฅ๋ ์์ธ ๋ฉ์์ง์ ํจ๊ป ์ฌ์ฉ์ ์ค๋ฅ๋ก์ ๋ฐ์ํฉ๋๋ค.
def this() = {
// Initialize here.
}
ํจ์ ์ธ์ ์ฒ๋ฆฌํ๊ธฐยถ
UDF์ ์ธ์๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด SQL ์ฝ๋์์ UDF๊ฐ ํธ์ถ๋ ๋ Snowflake๊ฐ ํธ์ถํ ๊ณต์ฉ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ญ์์ค. CREATE FUNCTION ๋ช ๋ น์ผ๋ก UDF๋ฅผ ๋ง๋ค ๋ HANDLER ์ ์ ์ฌ์ฉํ์ฌ ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌ๊ธฐ๋ก ์ง์ ํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ์ ์ธํ ๋ ๋ค์์ ์ํํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ๊ณต์ฉ์ผ๋ก ์ ์ธํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํด ์ธ์ ์๋ ์์ฑ์๋ฅผ ์ ํ์ ์ผ๋ก ํฌํจํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์ฒ๋ฆฌ๊ธฐ ์ด๊ธฐํํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํด๋์ค๋ฅผ ์คํ ์ด์ง๋ ์ฒ๋ฆฌ๊ธฐ๋ก JAR์ ํจํค์งํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ดํ์ ๊ฐ๊ฐ์ CREATE FUNCTION ๋ฌธ์ HANDLER ์ ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๊ธฐ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์คํ ์ด์ง๋ ์ฒ๋ฆฌ๊ธฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง์ ์ ์งํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
UDF ์ ์ธ์์ ์ง์ ํ SQL ์ ํ์ ๋งคํ๋๋ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ๋งค๊ฐ ๋ณ์ ๋ฐ ๋ฐํ ์ ํ์ ์ง์ ํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ SQL-Scala ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ ํ์ ์ผ๋ก ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์์ ํธ์ถํ ๋ฉ์๋์ ๊ฐ์ด ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ์ ์ธํฉ๋๋ค.
๋ค์ ์์ ์ ์ฝ๋์๋ ์ธ์๋ก ๋ฐ์ ๋ฐฐ์ด์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ๋น ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋
concatenate
๋ฅผ ํธ์ถํ๋handleStrings
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๊ฐ ์์ต๋๋ค.CREATE OR REPLACE FUNCTION generate_greeting(greeting_words ARRAY) RETURNS VARCHAR LANGUAGE SCALA RUNTIME_VERSION = 2.12 HANDLER='StringHandler.handleStrings' AS $$ class StringHandler { def handleStrings(strings: Array[String]): String = { return concatenate(strings) } private def concatenate(strings: Array[String]): String = { var concatenated : String = "" for (newString <- strings) { concatenated = concatenated + " " + newString } return concatenated } } $$;
๋ค์์
generate_greeting
ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.SELECT generate_greeting(['Hello', 'world']);
๋ค์์ ์์ ๊ฐ์ผ๋ก
generate_greeting
์ ํธ์ถํ ์ถ๋ ฅ์ ๋ณด์ฌ์ค๋๋ค.Hello world
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ์ค๋ฒ๋ก๋ํ๊ธฐยถ
๋งค๊ฐ ๋ณ์ ์๊ฐ ๋ค๋ฅธ ํ ๋์ผํ ํด๋์ค ๋๋ ์ค๋ธ์ ํธ์์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ก๋ํ ์ ์์ต๋๋ค.
Scala UDF์ ๊ฒฝ์ฐ Snowflake๋ ์ ํ ์ด ์๋ ๋ฉ์๋ ์ธ์์ ๊ฐ์ ๋ง์ผ๋ก ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ๋ฐ์ดํฐ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ธํ๋ ๊ฒ์ ๋น์ค์ฉ์ ์ ๋๋ค. ์ผ๋ถ SQL ๋ฐ์ดํฐ ํ์ ์ ๋ ์ด์์ Scala ๋๋ Java ๋ฐ์ดํฐ ํ์ ์ ๋งตํ๋ ์ ์๊ณ ๋ฐ๋ผ์ ์ ์ฌ์ ์ผ๋ก ๋ ์ด์์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ์๋ช ์ ๋งตํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ Scala ๋ฉ์๋๊ฐ ๋์ผ ์ด๋ฆ๊ณผ ๋์ผ ์์ ์ธ์๋ฅผ ๊ฐ์ง๋ง ๋ฐ์ดํฐ ํ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ, ์ด๋ฌํ ๋ฉ์๋ ์ค ํ๋๋ฅผ ์ฒ๋ฆฌ๊ธฐ๋ก ์ฌ์ฉํ์ฌ UDF๋ฅผ ํธ์ถํ๋ฉด ๋ค์๊ณผ ์ ์ฌํ ์ค๋ฅ๊ฐ ์์ฑ๋ฉ๋๋ค.
Cannot determine which implementation of handler "handler name" to invoke since there are multiple
definitions with <number of args> arguments in function <user defined function name> with
handler <class name>.<handler name>
์จ์ดํ์ฐ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ, UDF๊ฐ ๋ง๋ค์ด์ง ๋ ์ค๋ฅ๊ฐ ๊ฐ์ง๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ, UDF๊ฐ ํธ์ถ๋ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.