Java UDF ์†Œ๊ฐœยถ

Java์—์„œ UDF(์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜)์˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ํ•ญ๋ชฉ์—์„œ๋Š” Java ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ๋„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UDF ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด ๋ชฉ๋ก์„ ํฌํ•จํ•˜์—ฌ, UDF์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๊ฐœ์š” ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด SQL๋กœ UDF๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. SQL์„ ์‚ฌ์šฉํ•˜์—ฌ UDF์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ ๋˜๋Š” UDF ์‹คํ–‰ํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Snowflake๋Š” ํ˜„์žฌ ๋‹ค์Œ Java ๋ฒ„์ „์—์„œ UDF ์ž‘์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • 11.x

  • 17.x

์ฐธ๊ณ 

Java UDF ์ฒ˜๋ฆฌ๊ธฐ์™€ ๊ด€๋ จ๋œ ์ œํ•œ ์‚ฌํ•ญ์€ Java UDF ์ œํ•œ ์‚ฌํ•ญ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ:

Java ์ฒ˜๋ฆฌ๊ธฐ ์ž‘๋™ ๋ฐฉ์‹ยถ

์‚ฌ์šฉ์ž๋Š” UDF๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ UDF์˜ ์ด๋ฆ„๊ณผ ์ธ์ž๋ฅผ Snowflake์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Snowflake๋Š” UDF์˜ ๋…ผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ จ ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ(์ธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ์ž๋„ ํฌํ•จ)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๋Š” ์ถœ๋ ฅ์„ Snowflake๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  Snowflake๋Š” ์ด๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

UDF์— ์ „๋‹ฌ๋œ ๊ฐ ํ–‰์— ๋Œ€ํ•ด UDF๋Š” ์Šค์นผ๋ผ(์ฆ‰, ๋‹จ์ผ) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ” ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ๊ฒฝ์šฐ ํ–‰ ์„ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Java UDF๋Š” ์ƒˆ ์ฝ”๋“œ์™€ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋‘˜ ๋‹ค ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ์—ฐ์„ฑ๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฏธ Java์— ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ Java UDF์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋‹จ์ˆœํ™”ํ•œ ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค.

UDF ๋ฐ์ดํ„ฐ ํ๋ฆ„

์˜ˆยถ

๋‹ค์Œ ์˜ˆ์ œ์˜ ์ฝ”๋“œ๋Š” ์ฒ˜๋ฆฌ๊ธฐ ๋ฉ”์„œ๋“œ TestFunc.echoVarchar ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ echo_varchar ์ด๋ผ๋Š” UDF๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Snowflake๋Š” SQL-Java ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋งคํ•‘ ์— ์„ค๋ช…๋œ ๋งคํ•‘์— ๋”ฐ๋ผ Java ์ธ์ž ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ SQL๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
  RETURNS VARCHAR
  LANGUAGE JAVA
  CALLED ON NULL INPUT
  HANDLER = 'TestFunc.echoVarchar'
  TARGET_PATH = '@~/testfunc.jar'
  AS
  'class TestFunc {
    public static String echoVarchar(String x) {
      return x;
    }
  }';
Copy

์„ค๊ณ„ ๊ณ ๋ ค ์‚ฌํ•ญยถ

์œ ์šฉํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค.

์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋”ฉยถ

๊ธฐ๋ณธ ์‚ฌํ•ญ๋ถ€ํ„ฐ ์ž์„ธํ•œ ์˜ˆ์ œ๊นŒ์ง€, ๋‹ค์Œ ํ•ญ๋ชฉ์—์„œ๋Š” UDF ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ Java๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • Java ํด๋ž˜์Šค ์ •์˜. Java ํด๋ž˜์Šค์—์„œ UDF์˜ ๋…ผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. Snowflake๊ฐ€ ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ž˜์Šค ์„ค๊ณ„ํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ. Snowflake๊ฐ€ ์ฒ˜๋ฆฌ๊ธฐ์—์„œ ์ƒ์„ฑ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ํ…Œ์ด๋ธ” ํ˜•์‹ ๋ฐ˜ํ™˜ ๊ฐ’. UDF์—์„œ ์Šค์นผ๋ผ(๋‹จ์ผ) ๊ฐ’๋ฟ ์•„๋‹ˆ๋ผ ํ…Œ์ด๋ธ” ํ˜•์‹ ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ํ˜•์‹ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…Œ์ด๋ธ” ํ˜•์‹ Java UDF(UDTF) ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ๋กœ๊น… ๋ฐ ์ด๋ฒคํŠธ ์ถ”์ . ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋กœ๊ทธ ๋ฐ ์ถ”์  ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๊น…, ์ถ”์  ๋ฐ ๋ฉ”ํŠธ๋ฆญ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์ข…์†์„ฑ. ์Šคํ…Œ์ด์ง€์— ์ข…์†์„ฑ์„ ์—…๋กœ๋“œํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ์— ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์ฒ˜๋ฆฌ๊ธฐ ํŒŒ์ผ ๊ตฌ์„ฑ. ์ปดํŒŒ์ผ๋œ ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ๋ฅผ JAR ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ ์ •๋ฆฌํ•˜๊ธฐ ์˜ ์ œ์•ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋นŒ๋“œํ•˜์‹ญ์‹œ์˜ค.

  • ์ฝ”๋“œ ์˜ˆ์ œ Java์˜ ๋‹ค์–‘ํ•œ ์ฒ˜๋ฆฌ๊ธฐ ์˜ˆ์ œ๋Š” Java UDF ์ฒ˜๋ฆฌ๊ธฐ์˜ ์˜ˆ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.