Java UDF ์ค๊ณยถ
์ด ํญ๋ชฉ์ Java UDF๋ฅผ ์ค๊ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ด ํญ๋ชฉ์ ๋ด์ฉ:
๋ฐ์ดํฐ ํ์ ์ ํํ๊ธฐยถ
์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์:
ํจ์๊ฐ ์ธ์๋ก ์๋ฝํด์ผ ํ๋ ๋ฐ์ดํฐ ํ์ , ๊ทธ๋ฆฌ๊ณ ํจ์๊ฐ ๋ฐํํด์ผ ํ๋ ๋ฐ์ดํฐ ํ์ ์ ์ ํํ์ญ์์ค.
ํ์์กด ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
NULL ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ์ญ์์ค.
๋งค๊ฐ ๋ณ์ ๋ฐ ๋ฐํ ํ์์ ๋ํ SQL-Java ๋ฐ์ดํฐ ํ์ ๋งคํยถ
Snowflake๊ฐ Java์ SQL ๋ฐ์ดํฐ ํ์ ๊ฐ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ SQL ๋ฐ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด ๊ฐ์ ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
TIMESTAMP_LTZ ๊ฐ ๋ฐ ํ์์กดยถ
Java UDF๋ ํธ์ถ๋๋ ํ๊ฒฝ๊ณผ ํฌ๊ฒ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์์กด์ ํธ์ถ ํ๊ฒฝ์์ ์์๋ฉ๋๋ค. ํธ์ถ์์ ์ธ์ ์ด Java UDF ํธ์ถ ์ ์ ๊ธฐ๋ณธ ํ์์กด์ ์ค์ ํ ๊ฒฝ์ฐ, Java UDF๋ ๋์ผํ ๊ธฐ๋ณธ ํ์์กด์ ๊ฐ์ต๋๋ค. Java UDF๋ ๊ธฐ๋ณธ TIMEZONE Snowflake SQL์ด ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ IANAํ์์กด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ(์ฆ, ํ์์กด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฆด๋ฆฌ์ค 2021a ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
NULL ๊ฐยถ
Snowflake๋ ๋ ๊ฐ์ง ๊ณ ์ ํ NULL ๊ฐ์ ์ง์ํ๋๋ฐ, ์ด๋ SQL NULL
๊ณผ VARIANT์ JSON null
์
๋๋ค. (Snowflake VARIANT NULL์ ๋ํ ์์ธํ ๋ด์ฉ์ NULL ๊ฐ ์ ์ฐธ์กฐํ์ญ์์ค.)
Java๋ ๊ธฐ๋ณธ์ด ์๋ ๋ฐ์ดํฐ ํ์
์๋ง ํด๋นํ๋ ํ๋์ null
๊ฐ์ ์ง์ํฉ๋๋ค.
Java UDF์ ๋ํ SQL NULL
์ธ์๋ Java null
๊ฐ์ผ๋ก ๋ณํ๋์ง๋ง, null
์ ์ง์ํ๋ Java ๋ฐ์ดํฐ ํ์
์๋ง ํด๋น๋ฉ๋๋ค.
๋ฐํ๋ Java null
๊ฐ์ SQL NULL
๋ก ๋ค์ ๋ณํ๋ฉ๋๋ค.
๋ฐฐ์ด๊ณผ ๊ฐ๋ณ ๊ฐ์์ ์ธ์ยถ
Java UDF๋ ๋ค์ Java ๋ฐ์ดํฐ ํ์ ์ ๋ฐฐ์ด์ ์์ ํ ์ ์์ต๋๋ค.
String
boolean
double
float
int
long
short
์ ๋ฌ๋ SQL ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ํด๋น Java ๋ฐ์ดํฐ ํ์ ๊ณผ ํธํ๋์ด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ ํ์ ํธํ์ฑ์ ๋ํ SQL-Java ๋ฐ์ดํฐ ํ์ ๋งคํ ์ ์ฐธ์กฐํ์ญ์์ค.
์ง์ ๋ ๊ฐ Java ๋ฐ์ดํฐ ํ์ ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค.
boolean: Snowflake ARRAY๋ BOOLEAN ์์๋ง ํฌํจํด์ผ ํ๋ฉฐ NULL ๊ฐ์ ํฌํจํด์๋ ์ ๋ฉ๋๋ค.
int/short/long: Snowflake ARRAY๋ ์ค์ผ์ผ์ด 0์ธ ๊ณ ์ ์์์ ์์๋ง ํฌํจํด์ผ ํ๋ฉฐ NULL ๊ฐ์ ํฌํจํด์๋ ์ ๋ฉ๋๋ค.
float/double: Snowflake ARRAY๋ ๋ค์ ์ค ํ๋๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.
FLOAT ์์.
๊ณ ์ ์์์ ์์(๋ชจ๋ ์ค์ผ์ผ ํฌํจ).
ARRAY๋ NULL ๊ฐ์ ํฌํจํ ์ ์์ต๋๋ค.
Java ๋ฉ์๋๋ ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์ด๋ฌํ ๋ฐฐ์ด์ ์์ ํ ์ ์์ต๋๋ค.
Java์ ๋ฐฐ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค.
Java์ varargs (๊ฐ๋ณ ์ธ์ ์) ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ SQL ์ฝ๋๋ ARRAY ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
ARRAY๋ฅผ ํตํด ์ ๋ฌยถ
Java ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฐฐ์ด๋ก ์ ์ธํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ค์ ๋ฉ์๋์ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ๋ฌธ์์ด ๋ฐฐ์ด์ ๋๋ค.
static int myMethod(int fixedArgument1, int fixedArgument2, String[] stringArray)
๋ค์์ ์์ ํ ์์ ๋๋ค.
ํ ์ด๋ธ์ ๋ง๋ค๊ณ ๋ก๋ฉํฉ๋๋ค.
CREATE TABLE string_array_table(id INTEGER, a ARRAY);
INSERT INTO string_array_table (id, a) SELECT
1, ARRAY_CONSTRUCT('Hello');
INSERT INTO string_array_table (id, a) SELECT
2, ARRAY_CONSTRUCT('Hello', 'Jay');
INSERT INTO string_array_table (id, a) SELECT
3, ARRAY_CONSTRUCT('Hello', 'Jay', 'Smith');
UDF๋ฅผ ๋ง๋ญ๋๋ค.
CREATE OR REPLACE FUNCTION concat_varchar_2(a ARRAY)
RETURNS VARCHAR
LANGUAGE JAVA
HANDLER = 'TestFunc_2.concatVarchar2'
TARGET_PATH = '@~/TestFunc_2.jar'
AS
$$
class TestFunc_2 {
public static String concatVarchar2(String[] strings) {
return String.join(" ", strings);
}
}
$$;
UDF๋ฅผ ํธ์ถํฉ๋๋ค.
SELECT concat_varchar_2(a)
FROM string_array_table
ORDER BY id;
+---------------------+
| CONCAT_VARCHAR_2(A) |
|---------------------|
| Hello |
| Hello Jay |
| Hello Jay Smith |
+---------------------+
Varargs๋ฅผ ํตํด ์ ๋ฌํ๊ธฐยถ
varargs๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
Java ์ฝ๋์์ Java์ varargs ์ ์ธ ์คํ์ผ์ ์ฌ์ฉํ์ญ์์ค.
static int myMethod(int fixedArgument1, int fixedArgument2, String ... stringArray)
๋ค์์ ์์ ํ ์์ ๋๋ค. ์ด ์์ ์ด์ ์(๋ฐฐ์ด์ ๊ฒฝ์ฐ) ๊ฐ์ ์ ์ผํ ์ค์ํ ์ฐจ์ด์ ์ ๋ฉ์๋์ ๋ํ ๋งค๊ฐ ๋ณ์ ์ ์ธ์ ๋๋ค.
ํ ์ด๋ธ์ ๋ง๋ค๊ณ ๋ก๋ฉํฉ๋๋ค.
CREATE TABLE string_array_table(id INTEGER, a ARRAY);
INSERT INTO string_array_table (id, a) SELECT
1, ARRAY_CONSTRUCT('Hello');
INSERT INTO string_array_table (id, a) SELECT
2, ARRAY_CONSTRUCT('Hello', 'Jay');
INSERT INTO string_array_table (id, a) SELECT
3, ARRAY_CONSTRUCT('Hello', 'Jay', 'Smith');
UDF๋ฅผ ๋ง๋ญ๋๋ค.
CREATE OR REPLACE FUNCTION concat_varchar(a ARRAY)
RETURNS VARCHAR
LANGUAGE JAVA
HANDLER = 'TestFunc.concatVarchar'
TARGET_PATH = '@~/TestFunc.jar'
AS
$$
class TestFunc {
public static String concatVarchar(String ... stringArray) {
return String.join(" ", stringArray);
}
}
$$;
UDF๋ฅผ ํธ์ถํฉ๋๋ค.
SELECT concat_varchar(a)
FROM string_array_table
ORDER BY id;
+-------------------+
| CONCAT_VARCHAR(A) |
|-------------------|
| Hello |
| Hello Jay |
| Hello Jay Smith |
+-------------------+
Snowflake์์ ๋ถ๊ณผํ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ์ ์ง๋๋ Java UDFs ์ค๊ณํ๊ธฐยถ
Snowflake์์ ์ ์คํ๋๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ ์ค๊ณ์ ๋ํ ์์ธํ ๋ด์ฉ์ Snowflake์์ ์ ์ฉํ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ์ ์ง๋๋ ์ฒ๋ฆฌ๊ธฐ ์ค๊ณํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํด๋์ค ์ค๊ณํ๊ธฐยถ
SQL ๋ฌธ์ด Java UDF๋ฅผ ํธ์ถํ๋ฉด Snowflake๋ ์ฌ์ฉ์๊ฐ ์์ฑํ Java ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. Java ๋ฉ์๋๋ฅผ โํธ๋ค๋ฌ ๋ฉ์๋โ ๋๋ ์ค์ฌ์ โํธ๋ค๋ฌโ๋ผ๊ณ ํฉ๋๋ค.
๋ชจ๋ Java ๋ฉ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ์๋๋ ํด๋์ค์ ์ผ๋ถ๋ก ์ ์ธ๋์ด์ผ ํฉ๋๋ค. ํธ๋ค๋ฌ ๋ฉ์๋๋ ํด๋์ค์ ์ ์ ๋ฉ์๋ ๋๋ ์ธ์คํด์ค ๋ฉ์๋์ผ ์ ์์ต๋๋ค. ํธ๋ค๋ฌ๊ฐ ์ธ์คํด์ค ๋ฉ์๋์ด๊ณ ํด๋์ค๊ฐ ์ธ์๊ฐ ์๋ ์์ฑ์๋ฅผ ์ ์ํ๋ ๊ฒฝ์ฐ, Snowflake๋ ์ด๊ธฐํ ์ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ํธ๋ค๋ฌ๊ฐ ์ ์ ๋ฉ์๋์ธ ๊ฒฝ์ฐ, ํด๋์ค์๋ ์์ฑ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
ํธ๋ค๋ฌ๋ Java UDF์ ์ ๋ฌ๋ ๊ฐ ํ์ ๋ํด ํ ๋ฒ ํธ์ถ๋ฉ๋๋ค. (์ฐธ๊ณ : ํด๋์ค์ ์ ์ธ์คํด์ค๋ ๊ฐ ํ์ ๋ํด ๋ง๋ค์ด์ง์ง ์์ต๋๋ค. Snowflake๋ ๋์ผํ ์ธ์คํด์ค์ ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ๊ฑฐ๋ ๋์ผํ ์ ์ ๋ฉ์๋๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ ์ ์์ต๋๋ค.)
์ฝ๋ ์คํ์ ์ต์ ํํ๊ธฐ ์ํด Snowflake๋ ์ด๊ธฐํ๊ฐ ๋๋ฆด ์ ์๋ ๋ฐ๋ฉด ํธ๋ค๋ฌ ๋ฉ์๋์ ์คํ์ ๋น ๋ฅด๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. Snowflake๋ ํธ๋ค๋ฌ๋ฅผ ์คํํ๋ ๊ฒ(ํ ํ์ ์ ๋ ฅ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋ ์๊ฐ)๋ณด๋ค ์ด๊ธฐํ ์คํ(UDF๋ฅผ ๋ก๋ฉํ๋ ์๊ฐ, ๊ทธ๋ฆฌ๊ณ ์์ฑ์๊ฐ ์ ์๋ ๊ฒฝ์ฐ ํธ๋ค๋ฌ ๋ฉ์๋์ ํฌํจ๋ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ๋ ์๊ฐ ํฌํจ)์ ๋ ๊ธด ์๊ฐ ์ ํ์ ์ค์ ํฉ๋๋ค.
ํด๋์ค ์ค๊ณ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ Java UDF ์ฒ๋ฆฌ๊ธฐ ์์ฑํ๊ธฐ ์ ์์ต๋๋ค.
์ค์นผ๋ผ UDFs์์ ์ด๊ธฐํ ์ต์ ํํ๊ธฐ ๋ฐ ์ ์ญ ์ํ ์ ์ดํ๊ธฐยถ
๋๋ถ๋ถ์ ํจ์ ๋ฐ ํ๋ก์์ ์ฒ๋ฆฌ๊ธฐ๋ ์๋ ์ง์นจ์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
ํ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ๊ณต์ ์ํ๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ธฐ ํจ์ ์ธ๋ถ์์(์: ๋ชจ๋์ด๋ ์์ฑ์์์) ์ด๊ธฐํํ์ญ์์ค.
์ค๋ ๋๋ก๋ถํฐ ์์ ํ๋๋ก ์ฒ๋ฆฌ๊ธฐ ํจ์ ๋๋ ๋ฉ์๋๋ฅผ ์์ฑํ์ญ์์ค.
ํ ๊ฐ์ ๋์ ์ํ๋ฅผ ์ ์ฅ ๋ฐ ๊ณต์ ํ์ง ๋ง์ญ์์ค.
UDF๊ฐ ์ด๋ฌํ ์ง์นจ์ ๋ฐ๋ฅผ ์ ์๊ฑฐ๋ ์ด๋ฌํ ์ง์นจ์ ์ด์ ๋ฅผ ๋ ๊น์ด ์ดํดํ๋ ค๋ ๊ฒฝ์ฐ, ๋ค์ ๋ช ๊ฐ์ง ํ์ ์น์ ์ ์ฝ์ผ์ญ์์ค.
Java UDF ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ดํดํ๊ธฐยถ
์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด Snowflake๋ JVM ์ ์ฒด์ ๊ฑธ์ณ, ๊ทธ๋ฆฌ๊ณ JVM ๋ด์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
JVM ์ ์ฒด์ ๊ฑธ์ณ:
Snowflake๋ ์จ์ดํ์ฐ์ค ์ ์์ ์ ์ ์ฒด์ ๊ฑธ์ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค. ๊ฐ ์์ ์๋ ํ๋ ์ด์์ JVM์ ์คํํฉ๋๋ค. ์ด๋ ์ ์ญ ๊ณต์ ์ํ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ๊ธฐ๊ปํด์ผ ๋จ์ผ JVM ๋ด์์๋ง ์ํ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
JVM ๋ด์์:
๊ฐ JVM์ ๋์ผํ ์ธ์คํด์ค์ ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ๋ณ๋ ฌ๋ก ํธ์ถํ ์ ์๋ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ ํธ๋ค๋ฌ ๋ฉ์๋๊ฐ ์ค๋ ๋๋ก๋ถํฐ ์์ ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
UDF๊ฐ IMMUTABLE์ด๊ณ SQL ๋ฌธ์ด ๋์ผ ํ์ ๋ํด ๋์ผ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ UDF๋ฅผ ๋ ๋ฒ ์ด์ ํธ์ถํ๋ ๊ฒฝ์ฐ, UDF๋ ํด๋น ํ์ ๊ฐ ํธ์ถ์ ๋ํด ๋์ผ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, UDF๊ฐ IMMUTABLE์ธ ๊ฒฝ์ฐ ๋ค์์ ๊ฐ ํ์ ๋ํด ๋์ผ ๊ฐ์ ๋ ๋ฒ ๋ฐํํฉ๋๋ค.
SELECT my_java_udf(42), my_java_udf(42) FROM table1;
๋์ผ ์ธ์๊ฐ ์ ๋ฌ๋ ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ ํธ์ถ์ด ๋ ๋ฆฝ ๊ฐ์ ๋ฐํํ๊ณ ํจ์ VOLATILE์ ์ ์ธํ์ง ์์ผ๋ ค๋ฉด ์ฌ๋ฌ ๊ฐ๋ณ UDF๋ฅผ ๋์ผ ํธ๋ค๋ฌ ๋ฉ์๋์ ๋ฐ์ธ๋ฉํ์ญ์์ค. ์:
๋ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ
@java_udf_stage/rand.jar
์ด๋ผ๋ JAR ํ์ผ์ ๋ง๋ญ๋๋ค.class MyClass { private double x; // Constructor public MyClass() { x = Math.random(); } // Handler public double myHandler() { return x; } }
์๋์ ๊ฐ์ด Java UDF๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ฌํ UDF๋ ์ด๋ฆ์ด ๋ค๋ฅด์ง๋ง, ๋์ผ JAR ํ์ผ์ ์ฌ์ฉํ๋ฉฐ, ํด๋น JAR ํ์ผ ๋ด์์ ๋์ผ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CREATE FUNCTION my_java_udf_1() RETURNS DOUBLE LANGUAGE JAVA IMPORTS = ('@java_udf_stage/rand.jar') HANDLER = 'MyClass.myHandler'; CREATE FUNCTION my_java_udf_2() RETURNS DOUBLE LANGUAGE JAVA IMPORTS = ('@java_udf_stage/rand.jar') HANDLER = 'MyClass.myHandler';
๋ค์ ์ฝ๋๋ ๋ UDF๋ฅผ ๋ชจ๋ ํธ์ถํฉ๋๋ค. UDF๋ ๋์ผํ JAR ํ์ผ ๋ฐ ํธ๋ค๋ฌ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์ด๋ฌํ ํธ์ถ์ ๋์ผํ ํด๋์ค์ ๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ๊ฐ ์ธ์คํด์ค๋ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ๋ฐํํ๋ฏ๋ก ์๋ ์์์๋ ๋์ผ ๊ฐ์ ๋ ๋ฒ ๋ฐํํ๋ ๋์ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ๋ฐํํฉ๋๋ค.
SELECT my_java_udf_1(), my_java_udf_2() FROM table1;
JVM ์ํ ์ ๋ณด ์ ์ฅํ๊ธฐยถ
๋์ ๊ณต์ ์ํ์ ์์กดํ์ง ์๋ ํ ๊ฐ์ง ์ด์ ๋ ํ์ด ๋ฐ๋์ ์์ธก ๊ฐ๋ฅํ ์์๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค. SQL ๋ฌธ์ด ์คํ๋ ๋๋ง๋ค Snowflake๋ ๋ฐฐ์น ์, ๋ฐฐ์น๊ฐ ์ฒ๋ฆฌ๋๋ ์์, ๋ฐฐ์น ๋ด์ ํ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ํ ํ์ด ํ์ ํ์ ๋ฐํ ๊ฐ์ ์ํฅ์ ๋ฏธ์น๋๋ก ์ค์นผ๋ผ UDF๊ฐ ์ค๊ณ๋ ๊ฒฝ์ฐ, UDF๋ UDF๊ฐ ์คํ๋ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌยถ
UDF๋ก ์ฌ์ฉ๋๋ Java ๋ฉ์๋๋ ์ผ๋ฐ Java ์์ธ ์ฒ๋ฆฌ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ๋ด์์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค.
๋ฉ์๋ ๋ด์์ ์์ธ๊ฐ ๋ฐ์ํ๊ณ ์ด ์์ธ๊ฐ ๋ฉ์๋์์ ํฌ์ฐฉ๋์ง ์์ผ๋ฉด Snowflake๋ ์์ธ์ ๋ํ ์คํ ์ถ์ ์ ํฌํจํ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ฒ๋ฆฌ๋์ง ์์ ์์ธ ๋ก๊น ์ด ํ์ฑํ๋๋ฉด Snowflake๋ ์ด๋ฒคํธ ํ ์ด๋ธ์ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ์ข ๋ฃํ๊ณ SQL ์ค๋ฅ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์์ธ๋ฅผ ํฌ์ฐฉํ์ง ์๊ณ ๋ช ์์ ์ผ๋ก ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ์:
if (x < 0) {
throw new IllegalArgumentException("x must be non-negative.");
}
๋๋ฒ๊น ํ ๋ SQL ์ค๋ฅ ๋ฉ์์ง ํ ์คํธ์ ๊ฐ์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ ์ฒด Java ๋ฉ์๋ ๋ณธ๋ฌธ์ try-catch ๋ธ๋ก์ ๋ฐฐ์นํ๊ณ , ํฌ์ฐฉ๋ ์ค๋ฅ ๋ฉ์์ง์ ์ธ์ ๊ฐ์ ์ถ๊ฐํ๊ณ , ํ์ฅ๋ ๋ฉ์์ง์ ํจ๊ป ์์ธ๋ฅผ ๋ฐ์์ํค์ญ์์ค. ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋์ง ์๋๋ก ํ๋ ค๋ฉด JAR ํ์ผ์ ํ๋ก๋์ ํ๊ฒฝ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ธ์ ๊ฐ์ ์ ๊ฑฐํ์ญ์์ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ๋ฅด๊ธฐยถ
ํ๋ซํผ ๋ ๋ฆฝ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ์ญ์์ค.
ํน์ CPU ์ํคํ ์ฒ(์: x86)๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋๋ฅผ ํผํ์ญ์์ค.
ํน์ ์ด์ ์ฒด์ ๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋๋ฅผ ํผํ์ญ์์ค.
์ด๊ธฐํ ์ฝ๋๋ฅผ ์คํํด์ผ ํ์ง๋ง, ํธ์ถํ๋ ๋ฉ์๋์ ์ด๋ฅผ ํฌํจํ์ง ์์ผ๋ ค๋ฉด ์ด๊ธฐํ ์ฝ๋๋ฅผ ์ ์ ์ด๊ธฐํ ๋ธ๋ก์ ๋ฃ์ ์ ์์ต๋๋ค.
์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ๋ฅํ๋ฉด CREATE FUNCTION ๋๋ CREATE PROCEDURE TARGET_PATH ๋งค๊ฐ ๋ณ์์ ๊ฐ์ ์ง์ ํ์ญ์์ค. ๊ทธ๋ฌ๋ฉด ํธ์ถํ ๋๋ง๋ค ๋ค์ ์ปดํ์ผํ๋ ๋์ ์ด์ ์ ์์ฑ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋ ์ถ๋ ฅ์ ์ฌ์ฌ์ฉํ๋๋ก Snowflake์ ์๋ ค์ฃผ๊ฒ ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ ํญ๋ชฉ:
์ฐ์ํ ๋ณด์ ๊ดํ ๋ฐ๋ฅด๊ธฐยถ
์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ ํ ๋ฐฉ์์ผ๋ก ์๋ํ๋๋ก ๋ณด์ฅํ๋ ค๋ฉด UDF ๋ฐ ํ๋ก์์ ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก ์ ์ค๋ช ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฐธ์กฐํ์ญ์์ค.