Java UDF ์ฒ๋ฆฌ๊ธฐ ์์ฑํ๊ธฐยถ
์ด ํญ๋ชฉ์์๋ UDF(์ฌ์ฉ์ ์ ์ ํจ์)์ Java ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค. Java UDF๋ฅผ ์์ฑํ ๋ Snowflake๊ฐ UDF ๋ ผ๋ฆฌ๋ก ์คํ๋๋๋ก Java ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด Java ์ฝ๋๋ UDF์ ์ฒ๋ฆฌ๊ธฐ์ ๋๋ค.
CREATE FUNCTION ๊ณผ ํจ๊ป UDF๋ฅผ ๋ฐฐํฌํ์ฌ UDF์ ์ด๋ฆ์ ์ง์ ํ๊ณ Java ๋ฉ์๋๋ฅผ UDF๊ฐ ํธ์ถ๋ ๋ ์ฌ์ฉํ ์ฒ๋ฆฌ๊ธฐ๋ก ์ง์ ํฉ๋๋ค. SQL์ ์ฌ์ฉํ UDF ์์ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ์ฉ์ ์ ์ ํจ์ ์์ฑํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ ๋ง์ ์์ ์ฝ๋๋ Java UDF ์ฒ๋ฆฌ๊ธฐ์ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ด ํญ๋ชฉ์ ๋ด์ฉ:
Java๋ก UDF ์ฒ๋ฆฌ๊ธฐ ์์ฑํ๊ธฐยถ
Java UDF ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ๋ ๋ค์ ์๊ตฌ ์ฌํญ๊ณผ ์ง์นจ์ ์ฌ์ฉํ์ญ์์ค.
ํด๋์ค๋ฅผ public์ผ๋ก ์ ์ํ์ญ์์ค.
ํด๋์ค ๋ด์์ UDF ์ฒ๋ฆฌ๊ธฐ๋ก ์ฌ์ฉํ ๊ณต์ฉ ๋ฉ์๋๋ฅผ ํ๋ ์ด์ ์ ์ธํฉ๋๋ค.
์ธ๋ผ์ธ UDF์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ํ๋๋ง ์ ์ธํฉ๋๋ค. ๋์ ํด๋์ค๋ฅผ ์คํ ์ด์ง๋ ์ฒ๋ฆฌ๊ธฐ๋ก JAR์ ํจํค์งํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ดํ์ ๊ฐ๊ฐ์ CREATE FUNCTION ๋ฌธ์ HANDLER ์ ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๊ธฐ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ์ ์คํ ์ด์ง๋ ์ฒ๋ฆฌ๊ธฐ์ ์ฐจ์ด์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง์ ์ ์งํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํ์ํ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ก ํธ์ถํ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
๊ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์ ๋ํด ๋ค์ ์๊ตฌ ์ฌํญ๊ณผ ์ง์นจ์ ์ฌ์ฉํฉ๋๋ค.
์ ์ ์ด๋ ๋น์ ์ ์ด๋ , ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ๊ณต์ฉ์ผ๋ก ์ ์ธํฉ๋๋ค.
๋ฉ์๋๊ฐ ๋น์ ์ ์ธ ๊ฒฝ์ฐ ํด๋์ค๋ ๋ํ ์ธ์๊ฐ ์๋ ์์ฑ์๋ฅผ ์ ์ธํ๊ฑฐ๋ ์์ฑ์๋ฅผ ์ ํ ์ ์ธํ์ง ์์์ผ ํฉ๋๋ค.
Snowflake๋ ํด๋์ค๋ฅผ ์ธ์คํด์คํํ ๋ ์์ฑ์์ ์ด๋ค ์ธ์๋ ์ ๋ฌํ์ง ์์ต๋๋ค. ์์ฑ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ์ด ์ค๋ฅ๋ ์์ธ ๋ฉ์์ง์ ํจ๊ป ์ฌ์ฉ์ ์ค๋ฅ๋ก์ ๋ฐ์ํฉ๋๋ค.
์ ์ ํ ๋ฐํ ํ์์ ์ง์ ํ์ญ์์ค.
๋ฐํ ํ์์ SQL-Java ํ์ ๋งคํ ํ ์ด๋ธ ์
Java Data Type
์ด์ ์ง์ ๋ ๋ฐ์ดํฐ ํ์ ์ค ํ๋์ฌ์ผ ํฉ๋๋ค. ๋ฐํ ํ์์ CREATE FUNCTION ๋ฌธ์ RETURNS ์ ์ ์ง์ ๋ SQL ๋ฐ์ดํฐ ํ์ ๊ณผ ํธํ๋์ด์ผ ํฉ๋๋ค.๊ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ์ธ์(์๋ ๊ฒฝ์ฐ)๊ฐ SQL-Java Type Mappings ํ ์ด๋ธ ์
Java Data Type
์ด์ ์ง์ ๋ ๋ฐ์ดํฐ ํ์ ์ธ์ง ํ์ธํฉ๋๋ค.Java ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ ์ ํํ ๋ Snowflake์์ ์ ์ก(๋ฐ ๋ฐํ)๋ ์ ์๋ ๋ฐ์ดํฐ์ ๊ฐ๋ฅํ ์ต๋๊ฐ ๋ฐ ์ต์๊ฐ์ ๊ณ ๋ คํ์ญ์์ค.
์ฃผ์ด์ง Java ํด๋์ค์์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ก๋ํ๋ ๊ฒฝ์ฐ Snowflake๋ ๋ฉ์๋ ์ธ์์ ์ ํ ์ด ์๋ ๊ฐ์ ๋ง ์ฌ์ฉํ์ฌ ํด๋์ค ๋ด์์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ๊ตฌ๋ณํ๋ค๋ ์ ์ ๋ช ์ฌํ์ญ์์ค. ๋ฐ์ดํฐ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ธํ๋ ๊ฒ์ ๋น์ค์ฉ์ ์ ๋๋ค. ์ผ๋ถ SQL ๋ฐ์ดํฐ ํ์ ์ ๋ ์ด์์ Java ๋ฐ์ดํฐ ํ์ ์ ๋งตํ๋ ์ ์๊ณ ๋ฐ๋ผ์ ์ ์ฌ์ ์ผ๋ก ๋ ์ด์์ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ์๋ช ์ ๋งตํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ด๋ค ํด๋์ค์์ ๋ Java ๋ฉ์๋๊ฐ ๋์ผ ์ด๋ฆ๊ณผ ๋์ผ ์์ ์ธ์๋ฅผ ๊ฐ๊ณ ๋ฐ์ดํฐ ํ์ ์ ๋ค๋ฅธ ๊ฒฝ์ฐ, ์ด๋ฌํ ๋ฉ์๋ ์ค ํ๋๋ฅผ ์ฒ๋ฆฌ๊ธฐ๋ก ์ฌ์ฉํ๋ 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๊ฐ ํธ์ถ๋ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์ ๊ฐ ๋ฉ์๋๊ฐ ํธ์ถํ๋ ๋ฉ์๋์์ Java UDF์ ๋ํด Snowflake๊ฐ ์ ์ฉํ ์ ์ฝ ์กฐ๊ฑด์ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํ ์์ธํ ๋ด์ฉ์ Snowflake์์ ์ ์ฉํ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ์ ์ง๋๋ ์ฒ๋ฆฌ๊ธฐ ์ค๊ณํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํด๋์ค ๊ฒฝ๋ก์ ์ข ์ ํญ๋ชฉ ์ถ๊ฐํ๊ธฐยถ
์ฒ๋ฆฌ๊ธฐ ์ฝ๋์ ์ธ๋ถ JAR ํ์ผ์ ํจํค์ง๋ ํด๋์ค๊ฐ ํ์ํ ๋๋ ์ฒ๋ฆฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์๋ Snowflake ๊ด๋ฆฌ ํด๋์ค ๊ฒฝ๋ก์ ์ด๋ฌํ ์ข ์ ํญ๋ชฉ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ค์์ Java UDF ์ฒ๋ฆฌ๊ธฐ์์ ๋ณผ ์ ์๋ ํด๋์ค ๊ฒฝ๋ก์ JAR ํ์ผ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฝ๋์ ์ข ์์ฑ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
ํ์ผ ์ ๋ฆฌํ๊ธฐยถ
Java ์ฝ๋๋ฅผ ์ปดํ์ผํ์ฌ JAR ํ์ผ์ ์ง์ ๋ง๋ค ๊ณํ์ด๋ผ๋ฉด ์๋์ ๊ฐ์ด ํ์ผ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด ์์์๋ Java์ ํจํค์ง ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ ๊ณํ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
developmentDirectory
packageDirectory
class_file1.java
class_file2.java
classDirectory
class_file1.class
class_file2.class
manifest_file.manifest(์ ํ ์ฌํญ)
jar_file.jar
put_command.sql
developmentDirectory
์ด ๋๋ ํฐ๋ฆฌ์๋ Java UDF๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ํ๋ก์ ํธ๋ณ ํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค.
packageDirectory
์ด ๋๋ ํฐ๋ฆฌ์๋ ํจํค์ง์ ์ปดํ์ผํ๊ณ ํฌํจํ .java ํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค.
class_file#.java
์ด ํ์ผ์๋ UDF์ Java ์์ค ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
class_file#.class
์ด๋ค์ .java ํ์ผ์ ์ปดํ์ผํ์ฌ ๋ง๋ค์ด์ง .class ํ์ผ์ ๋๋ค.
manifest_file.manifest
.class ํ์ผ(๋ฐ ํ์์ ๋ฐ๋ผ ์ข ์์ฑ JAR ํ์ผ)์ JAR ํ์ผ์ ๊ฒฐํฉํ ๋ ์ฌ์ฉ๋๋ ์ ํ์ ๋งค๋ํ์คํธ ํ์ผ์ ๋๋ค.
jar_file.jar
UDF ์ฝ๋๊ฐ ํฌํจ๋ JAR ํ์ผ์ ๋๋ค.
put_command.sql
์ด ํ์ผ์๋ JAR ํ์ผ์ Snowflake ์คํ ์ด์ง ์ ๋ณต์ฌํ๋ SQL PUT ๋ช ๋ น์ด ํฌํจ๋์ด ์์ต๋๋ค.
Java ์ฝ๋ ์ปดํ์ผํ๊ธฐ ๋ฐ JAR ํ์ผ ๋ง๋ค๊ธฐยถ
์ปดํ์ผ๋ Java ์ฝ๋๊ฐ ํฌํจ๋ JAR ํ์ผ์ ๋ง๋ค๋ ค๋ฉด:
javac๋ฅผ ์ฌ์ฉํ์ฌ .java ํ์ผ์ .class ํ์ผ๋ก ์ปดํ์ผํ์ญ์์ค.
๋ฒ์ 11.x๋ณด๋ค ์ต์ ๋ฒ์ ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, โ-releaseโ ์ต์ ์ ์ฌ์ฉํ์ฌ ๋์ ๋ฒ์ ์ด ๋ฒ์ 11์์ ์ง์ ํ ์ ์์ต๋๋ค.
.class ํ์ผ์ JAR ํ์ผ์ ๋ฃ์ผ์ญ์์ค. ์ฌ๋ฌ ํด๋์ค ํ์ผ(๋ฐ ๊ธฐํ JAR ํ์ผ)์ JAR ํ์ผ์ ํจํค์งํ ์ ์์ต๋๋ค.
์:
jar cf ./my_udf.jar MyClass.class
์ฒ๋ฆฌ๊ธฐ ํด๋์ค๊ฐ ํจํค์ง์ ์์ผ๋ฉด ๋งค๋ํ์คํธ ํ์ผ์ด ํ์์ ์ด๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ํ ์ฌํญ์ ๋๋ค. ๋ค์ ์์์๋ ๋งค๋ํ์คํธ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค.
jar cmf my_udf.manifest ./my_udf.jar example/MyClass.class
๋ชจ๋ ์ข ์์ฑ์ด ํฌํจ๋ jar ํ์ผ์ ๋น๋ํ๋ ค๋ฉด maven-assembly-plugin๊ณผ ํจ๊ป Maven์
mvn package
๋ช ๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค. maven-assembly-plugin์ ๋ํ ์์ธํ ๋ด์ฉ์ Maven ์ฌ์ฉ ํ์ด์ง ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.Snowflake๋ ํ์ค Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ (์:
java.util
)๋ฅผ ์๋์ผ๋ก ์ ๊ณตํฉ๋๋ค. ์ฝ๋์์ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ JAR ํ์ผ์ ํฌํจํ ํ์๊ฐ ์์ต๋๋ค.๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํธ์ถํ๋ ๋ฉ์๋๋ Java ๋ฉ์๋์ ๋์ผํ Snowflake ๋ถ๊ณผ ์ ์ฝ ์กฐ๊ฑด์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํ ์์ธํ ๋ด์ฉ์ Snowflake์์ ์ ์ฉํ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ์ ์ง๋๋ ์ฒ๋ฆฌ๊ธฐ ์ค๊ณํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
JAR ํ์ผ์ ์คํ ์ด์ง์ ๋ณต์ฌํ๊ธฐยถ
Snowflake๊ฐ ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋๋ฅผ ํฌํจํ JAR์์ ์ฝ๋๋ก ํ๋ ค๋ฉด JAR๋ฅผ ๋ค์ ์ข ๋ฅ์ ์คํ ์ด์ง ์ค ํ๋๋ก ๋ณต์ฌํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์ ๋๋ ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง.
Snowflake๋ ํ์ฌ ํ ์ด๋ธ ์คํ ์ด์ง๋ฅผ ์ฌ์ฉํ์ฌ UDF ์ฒ๋ฆฌ๊ธฐ๊ฐ ์๋ JAR ํ์ผ์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค. ๋ด๋ถ ์คํ ์ด์ง์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ก์ปฌ ํ์ผ์ ์ํ ๋ด๋ถ ์คํ ์ด์ง ์ ํํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ธ๋ถ ์คํ ์ด์ง.
JAR ํ์ผ์ ํธ์คํ ํ๋ ์คํ ์ด์ง๋ UDF ์์ ์ ๊ฐ ์ฝ์ ์ ์์ด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก PUT ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๋ช
๋ช
๋ ๋ด๋ถ ์คํ
์ด์ง๋ก JAR๋ฅผ ์
๋ก๋ํฉ๋๋ค. Snowflake GUI๋ฅผ ํตํด PUT
๋ช
๋ น์ ์คํํ ์ ์์ผ๋ฉฐ, SnowSQL์ ์ฌ์ฉํด PUT
์ ์คํํ ์ ์์ต๋๋ค. .jar ํ์ผ์ ์คํ
์ด์ง์ ๋ณต์ฌํ๋ ์์ PUT
๋ช
๋ น์ Java UDF ์ฒ๋ฆฌ๊ธฐ์ ์ ์น์
์ ์ฐธ์กฐํ์ญ์์ค.
์คํ ์ด์ง ์์ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ CREATE STAGE ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๊ฒฝ๊ณ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
JAR ํ์ผ์ ์ญ์ ํ๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ๋ ์ด์ UDF๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
JAR ํ์ผ์ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ:
UDF๋ฅผ ํธ์ถํ ์ ์๋ ๋์ ์ ๋ฐ์ดํธํ์ญ์์ค.
์ด์ .jar ํ์ผ์ด ์์ง ์คํ ์ด์ง์ ์๋ ๊ฒฝ์ฐ,
PUT
๋ช ๋ น์OVERWRITE=TRUE
์ ์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค.
์ฐธ๊ณ
UDF์ ๊ด๋ จ๋ ์์ ์ ์ํํ๋ ์ฌ์ฉ์๋ ์์ ์ ํ์ํ ๊ถํ์ด ํ ๋น๋ ์ญํ ์ด ์์ด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฌ์ฉ์ ์ ์ ํจ์์ ๋ํ ๊ถํ ๋ถ์ฌ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.