Scala UDF ์†Œ๊ฐœยถ

Scala์—์„œ UDF(์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜)์˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๊ธฐ๋Š” SQL์—์„œ ํ˜ธ์ถœ๋  ๋•Œ ํ•จ์ˆ˜์˜ ๋…ผ๋ฆฌ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

  • 2.12

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

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

์ฐธ๊ณ 

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

Snowpark API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Scala๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UDF๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Scala์—์„œ DataFrame์šฉ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF) ๋งŒ๋“ค๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

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

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

์ฒ˜๋ฆฌ๊ธฐ์˜ ๋…ผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋Š” ์ฒ˜๋ฆฌ๊ธฐ ์™ธ๋ถ€์— ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Scala์— ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Scala์—์„œ ์ฒ˜๋ฆฌ๊ธฐ ์ž‘์„ฑ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋Š” ์ผ๋ฐ˜ Scala UDF ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋”ฉ ์ง€์นจ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์Šค์นผ๋ผ ํ•จ์ˆ˜ ์ž‘์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Scala๋กœ ์Šค์นผ๋ผ UDF ์ž‘์„ฑํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์˜ˆยถ

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

CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
  RETURNS VARCHAR
  LANGUAGE SCALA
  RUNTIME_VERSION = 2.12
  HANDLER='TestFunc.echoVarchar'
  AS
  $$
  class TestFunc {
    def echoVarchar(x : String): String = {
      return x
    }
  }
  $$;
Copy

UDF ํ˜ธ์ถœํ•˜๊ธฐยถ

SELECT echo_varchar('Hello');
Copy

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

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

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

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