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
    
    Copy

    ์ฒ˜๋ฆฌ๊ธฐ ํด๋ž˜์Šค๊ฐ€ ํŒจํ‚ค์ง€์— ์žˆ์œผ๋ฉด ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์ด ํ•„์ˆ˜์ ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    jar cmf my_udf.manifest ./my_udf.jar example/MyClass.class
    
    Copy

    ๋ชจ๋“  ์ข…์†์„ฑ์ด ํฌํ•จ๋œ 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์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ์ž‘์—…์— ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ํ• ๋‹น๋œ ์—ญํ• ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ถŒํ•œ ๋ถ€์—ฌ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.