CREATE FUNCTIONยถ
์ UDF(์ฌ์ฉ์ ์ ์ ํจ์) ๋ฅผ ๋ง๋ญ๋๋ค. ๊ตฌ์ฑ ๋ฐฉ์์ ๋ฐ๋ผ ์ด ํจ์๋ ์ค์นผ๋ผ ๊ฒฐ๊ณผ ๋๋ ํ ์ด๋ธ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
UDF๋ฅผ ๋ง๋ค ๋ ์ง์๋๋ ์ธ์ด ์ค ํ๋๋ก ์ฝ๋๊ฐ ์์ฑ๋ ํธ๋ค๋ฌ๋ฅผ ์ง์ ํฉ๋๋ค. ํธ๋ค๋ฌ์ ์ธ์ด์ ๋ฐ๋ผ, CREATE FUNCTION ๋ฌธ๊ณผ ํจ๊ป ์ธ๋ผ์ธ์ผ๋ก ํธ๋ค๋ฌ ์์ค ์ฝ๋๋ฅผ ํฌํจํ๊ฑฐ๋ ํธ๋ค๋ฌ๊ฐ ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ์ฝ๋์ด๊ฑฐ๋ ์คํ ์ด์ง์ ์์ค ์ฝ๋์ธ ๊ฒฝ์ฐ CREATE FUNCTION์์ ํธ๋ค๋ฌ ์์น๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
๋ค์ ํ์๋ ์ง์๋๋ ๊ฐ ์ธ์ด์ ํด๋น ์ฝ๋๊ฐ CREATE FUNCTION๊ณผ ํจ๊ป ์ธ๋ผ์ธ์ผ๋ก ์ ์ง๋ ์ ์๋์ง, ๋๋ ์คํ ์ด์ง์ ์ ์ง๋ ์ ์๋์ง ์ฌ๋ถ๊ฐ ๋์ด๋์ด ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ฅผ ์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง์ ์ ์งํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ธ์ด |
์ฒ๋ฆฌ๊ธฐ ์์น |
---|---|
์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง๋จ |
|
์ธ๋ผ์ธ |
|
์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง๋จ |
|
์ธ๋ผ์ธ ๋๋ ์คํ ์ด์ง๋จ |
|
์ธ๋ผ์ธ |
์ด ๋ช ๋ น์ ๋ค์ ๋ณํ์ ์ง์ํฉ๋๋ค.
CREATE OR ALTER FUNCTION: ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ ํจ์๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ํจ์๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
- ์ฐธ๊ณ ํญ๋ชฉ:
ALTER FUNCTION, DROP FUNCTION, SHOW USER FUNCTIONS , DESCRIBE FUNCTION, CREATE OR ALTER <์ค๋ธ์ ํธ>
๊ตฌ๋ฌธยถ
CREATE FUNCTION์ ๊ตฌ๋ฌธ์ UDF ํธ๋ค๋ฌ๋ก ์ฌ์ฉํ๋ ์ธ์ด์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
Java ํธ๋ค๋ฌยถ
์์ค ์ฝ๋๊ฐ ์ธ๋ผ์ธ ์ํ์ธ ๊ฒฝ์ฐ ์๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ญ์์ค.
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
LANGUAGE JAVA
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
[ RUNTIME_VERSION = <java_jdk_version> ]
[ COMMENT = '<string_literal>' ]
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] ) ]
[ PACKAGES = ( '<package_name_and_version>' [ , ... ] ) ]
HANDLER = '<path_to_method>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
AS '<function_definition>'
์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์คํ ์ด์ง(์: JAR)์์ ์ฐธ์กฐ๋๋ ๊ฒฝ์ฐ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
LANGUAGE JAVA
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
[ RUNTIME_VERSION = <java_jdk_version> ]
[ COMMENT = '<string_literal>' ]
IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] )
HANDLER = '<path_to_method>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
JavaScript ํธ๋ค๋ฌยถ
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
LANGUAGE JAVASCRIPT
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
[ COMMENT = '<string_literal>' ]
AS '<function_definition>'
Python ํธ๋ค๋ฌยถ
์์ค ์ฝ๋๊ฐ ์ธ๋ผ์ธ ์ํ์ธ ๊ฒฝ์ฐ ์๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ญ์์ค.
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] [ AGGREGATE ] FUNCTION [ IF NOT EXISTS ] <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
LANGUAGE PYTHON
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
RUNTIME_VERSION = <python_version>
[ COMMENT = '<string_literal>' ]
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] ) ]
[ PACKAGES = ( '<package_name>[==<version>]' [ , ... ] ) ]
[ ARTIFACT_REPOSITORY = '<repository_name>' ]
[ ARTIFACT_REPOSITORY_PACKAGES = ( '<package_name>' [ , ... ] ) ]
HANDLER = '<function_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
AS '<function_definition>'
์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์คํ ์ด์ง(์: ๋ชจ๋)์์ ์ฐธ์กฐ๋๋ ๊ฒฝ์ฐ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] [ AGGREGATE ] FUNCTION [ IF NOT EXISTS ] <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
LANGUAGE PYTHON
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
RUNTIME_VERSION = <python_version>
[ COMMENT = '<string_literal>' ]
[ ARTIFACT_REPOSITORY = '<repository_name>' ]
[ ARTIFACT_REPOSITORY_PACKAGES = ( '<package_name>' [ , ... ] ) ]
IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] )
[ PACKAGES = ( '<package_name>[==<version>]' [ , ... ] ) ]
HANDLER = '<module_file_name>.<function_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
Scala ํธ๋ค๋ฌยถ
์์ค ์ฝ๋๊ฐ ์ธ๋ผ์ธ ์ํ์ธ ๊ฒฝ์ฐ ์๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ญ์์ค.
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS <result_data_type>
[ [ NOT ] NULL ]
LANGUAGE SCALA
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
[ RUNTIME_VERSION = <scala_version> ]
[ COMMENT = '<string_literal>' ]
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] ) ]
[ PACKAGES = ( '<package_name_and_version>' [ , ... ] ) ]
HANDLER = '<path_to_method>'
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
AS '<function_definition>'
์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์คํ ์ด์ง(์: JAR)์์ ์ฐธ์กฐ๋๋ ๊ฒฝ์ฐ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS <result_data_type>
[ [ NOT ] NULL ]
LANGUAGE SCALA
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ]
[ RUNTIME_VERSION = <scala_version> ]
[ COMMENT = '<string_literal>' ]
IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] )
HANDLER = '<path_to_method>'
SQL ํธ๋ค๋ฌยถ
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
[ [ NOT ] NULL ]
[ { VOLATILE | IMMUTABLE } ]
[ MEMOIZABLE ]
[ COMMENT = '<string_literal>' ]
AS '<function_definition>'
๋ฒ ๋ฆฌ์ธํธ ๊ตฌ๋ฌธยถ
CREATE OR ALTER FUNCTIONยถ
์์ง ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์ ํจ์๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ธฐ์กด ํจ์๋ฅผ ๋ฌธ์ ์ ์๋ ํจ์๋ก ๋ณํํฉ๋๋ค. CREATE OR ALTER FUNCTION ๋ฌธ์ CREATE FUNCTION ๋ฌธ์ ๊ตฌ๋ฌธ ๊ท์น์ ๋ฐ๋ฅด๋ฉฐ ALTER FUNCTION ๋ฌธ๊ณผ ์ ํ ์ฌํญ์ด ๋์ผํฉ๋๋ค.
์ง์๋๋ ํจ์ ๋ณ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํจ์ ์์ฑ ๋ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์: SECURE, MAX_BATCH_ROWS, LOG_LEVEL ๋๋ COMMENT.
์์ธํ ๋ด์ฉ์ CREATE OR ALTER FUNCTION ์ฌ์ฉ๋ฒ ๋ ธํธ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE [ OR ALTER ] FUNCTION ...
์ฐธ๊ณ
COPY GRANTS ๋งค๊ฐ ๋ณ์๋ ์ด ๋ฒ ๋ฆฌ์ธํธ ๊ตฌ๋ฌธ์์ ์ง์๋์ง ์์ต๋๋ค.
ํ์ ๋งค๊ฐ ๋ณ์ยถ
๋ชจ๋ ์ธ์ดยถ
name ( [ arg_name arg_data_type [ DEFAULT default_value ] ] [ , ... ] )
UDF์ ๋ํ ์๋ณ์(
name
), ์ ๋ ฅ ์ธ์, ์ ํ์ ์ธ์์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํฉ๋๋ค.์๋ณ์์ ๊ฒฝ์ฐ:
UDF๋ ์ด๋ฆ๊ณผ ์ธ์ ํ์ ์ ์กฐํฉ์ผ๋ก ์๋ณ ๋ฐ ํ์ธ ๋๊ธฐ ๋๋ฌธ์ ์๋ณ์๋ ํจ์๊ฐ ์์ฑ๋๋ ์คํค๋ง์ ๋ํด ๊ณ ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์๋ณ์๋ ์ํ๋ฒณ ๋ฌธ์๋ก ์์ํด์ผ ํ๋ฉฐ ์ ์ฒด ์๋ณ์ ๋ฌธ์์ด์ ํฐ๋ฐ์ดํ(์: โMy objectโ)๋ก ๋ฌถ์ง ์๋ ํ ๊ณต๋ฐฑ์ด๋ ํน์ ๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ธ ์๋ณ์๋ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์๋ณ์ ์๊ตฌ ์ฌํญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ ๋ ฅ ์ธ์์ ๊ฒฝ์ฐ:
arg_name
์ ๊ฒฝ์ฐ, ์ ๋ ฅ ์ธ์์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.arg_data_type
์ ๊ฒฝ์ฐ, ์ฌ์ฉ ์ค์ธ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด์ ํด๋นํ๋ Snowflake ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉํฉ๋๋ค.Java ์ฒ๋ฆฌ๊ธฐ ์ ๋ํด์๋ SQL-Java ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
JavaScript ์ฒ๋ฆฌ๊ธฐ ์ ๋ํด์๋ SQL ๋ฐ JavaScript ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Python ์ฒ๋ฆฌ๊ธฐ ์ ๋ํด์๋ SQL-Python ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Scala ์ฒ๋ฆฌ๊ธฐ ์ ๋ํด์๋ SQL-Scala ๋ฐ์ดํฐ ํ์ ๋งคํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ธ์๊ฐ ์ ํ ์ฌํญ์์ ๋ํ๋ด๋ ค๋ฉด
DEFAULT default_value
๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ์ญ์์ค. ๊ธฐ๋ณธ๊ฐ์๋ ๋ฆฌํฐ๋ด์ด๋ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ ํ์ ์ธ์๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ ํ์ ์ธ์ ๋ค์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
ํจ์์ ์ ํ์ ์ธ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฆ์ ๋์ผํ๊ณ ์๋ช ์ ๋ค๋ฅธ ์ถ๊ฐ ํจ์๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์ ํ์ ์ธ์ ์ง์ ํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
RETURNS ...
UDF์์ ๋ฐํํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ํ๋ฉฐ, ์ด์ ๋ฐ๋ผ UDF ํ์์ด ๊ฒฐ์ ๋ฉ๋๋ค.
result_data_type
: ์ง์ ๋ ๋ฐ์ดํฐ ํ์ ์ ๋จ์ผ ๊ฐ์ ๋ฐํํ๋ ์ค์นผ๋ผ UDF๋ฅผ ๋ง๋ญ๋๋ค.์ฐธ๊ณ
Java, Python ๋๋ Scala๋ก ์์ฑ๋ UDF ์ฒ๋ฆฌ๊ธฐ์ ๊ฒฝ์ฐ
result_data_type
์ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด์ ํด๋นํ๋ ๋ค์ ํ ์ด๋ธ์SQL Data Type
์ด์ ์์ด์ผ ํฉ๋๋ค.TABLE ( col_name col_data_type , ... )
: ์ง์ ๋ ํ ์ด๋ธ ์ด๊ณผ ์ด ํ์์ ํฌํจํ ํ ์ด๋ธ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํ ์ด๋ธ UDF๋ฅผ ๋ง๋ญ๋๋ค.์ฐธ๊ณ
Scala UDF์ ๊ฒฝ์ฐ UDFs ๋ฐํ ์ ํ์ด ์ง์๋์ง ์์ต๋๋ค.
AS function_definition
UDF๊ฐ ํธ์ถ๋ ๋ ์คํ๋๋ ํธ๋ค๋ฌ ์ฝ๋๋ฅผ ์ ์ํฉ๋๋ค.
function_definition
๊ฐ์ ํธ๋ค๋ฌ์ ๋ํด ์ง์๋๋ ์ธ์ด ์ค ํ๋๋ก ์์ฑ๋ ์์ค ์ฝ๋์ฌ์ผ ํฉ๋๋ค. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.Java. ์์ธํ ๋ด์ฉ์ Java UDF ์๊ฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
JavaScript. ์์ธํ ๋ด์ฉ์ JavaScript UDF ์๊ฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Python. ์์ธํ ๋ด์ฉ์ Python UDF ์๊ฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Scala ์์ธํ ๋ด์ฉ์ Scala UDF ์๊ฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
SQL ์์ ๋๋ค. ์์ธํ ๋ด์ฉ์ SQL UDF ์๊ฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์์ธํ ๋ด์ฉ์ ์ด ํญ๋ชฉ์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ ๋ ธํธ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
IMPORTS ์ ์ด ์๋ ์คํ ์ด์ง์์ UDF ํธ๋ค๋ฌ ์ฝ๋๋ฅผ ์ฐธ์กฐํ ๋ AS ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
Javaยถ
LANGUAGE JAVA
์ฝ๋๊ฐ Java ์ธ์ด๋ก ๋์ด ์์์ ์ง์ ํฉ๋๋ค.
RUNTIME_VERSION = java_jdk_version
์ฌ์ฉํ Java JDK ๋ฐํ์ ๋ฒ์ ์ ์ง์ ํฉ๋๋ค. ์ง์๋๋ Java ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
11.x
17.x
RUNTIME_VERSION ์ด ์ค์ ๋์ด ์์ง ์์ผ๋ฉด Java JDK 11์ด ์ฌ์ฉ๋ฉ๋๋ค.
IMPORTS = ( 'stage_path_and_file_name_to_read' [ , ... ] )
๊ฐ์ ธ์ฌ ํ์ผ์ ์์น(์คํ ์ด์ง), ๊ฒฝ๋ก, ์ด๋ฆ์ ๋๋ค.
ํ์ผ์ JAR ํ์ผ ๋๋ ๋ค๋ฅธ ์ ํ์ ํ์ผ์ผ ์ ์์ต๋๋ค.
ํ์ผ์ด JAR ํ์ผ์ธ ๊ฒฝ์ฐ ํ๋ ์ด์์ .class ํ์ผ๊ณผ 0๊ฐ ๋๋ ๊ทธ ์ด์์ ๋ฆฌ์์ค ํ์ผ์ ํฌํจํ ์ ์์ต๋๋ค.
JNI(Java ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค)๋ ์ง์๋์ง ์์ต๋๋ค. Snowflake๋ (Java ๋ฐ์ดํธ ์ฝ๋์๋ ๋์กฐ์ ์ผ๋ก) ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ฉํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค.
Java UDFs๋ JAR ํ์ผ์ด ์๋ ํ์ผ๋ ์ฝ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ณด๋ ค๋ฉด IMPORTS์์ ์ ์ ์ผ๋ก ์ง์ ๋ ํ์ผ ์ฝ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํ์ผ(JAR ํ์ผ ๋๋ ๊ธฐํ ํ์ผ)์ ์คํ ์ด์ง๋ก ๋ณต์ฌํ๋ ค๋ ๊ฒฝ์ฐ Snowflake์์๋ ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ PUT ๋ช ๋ น์ด ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง๋ก์ ํ์ผ ๋ณต์ฌ๋ฅผ ์ง์ํ๊ณ PUT ๋ช ๋ น์ด ๋ณดํต์ JAR ํ์ผ์ ์คํ ์ด์ง๋ก ๊ฐ์ฅ ์ฝ๊ฒ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ธ๋ถ ์คํ ์ด์ง๊ฐ ํ์ฉ๋์ง๋ง, PUT ์ ์ง์์ ๋ฐ์ง ์์ต๋๋ค.
ํ์ผ์ด ๋ค๋ฅธ ํ์ ๋๋ ํฐ๋ฆฌ๋ ๋ค๋ฅธ ์คํ ์ด์ง์ ์๋๋ผ๋ IMPORTS ์ ์ ๊ฐ ํ์ผ์ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
IMPORTS ๋ฐ TARGET_PATH ์ ์ด ๋ชจ๋ ์๋ ๊ฒฝ์ฐ, ํ์ผ์ด ๋ค๋ฅธ ํ์ ๋๋ ํฐ๋ฆฌ๋ ๋ค๋ฅธ ์คํ ์ด์ง์ ์๋๋ผ๋ TARGET_PATH ์ ์ ํ์ผ ์ด๋ฆ์ IMPORTS ์ ์ ๊ฐ ํ์ผ ์ด๋ฆ๊ณผ ๋ฌ๋ผ์ผ ํฉ๋๋ค.
Snowflake์์๋ TARGET_PATH ๊ฐ ๊ธฐ์กด ํ์ผ๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค. TARGET_PATH ๋ฅผ ์ฌ์ฉํด ๊ธฐ์กด ํ์ผ์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
์ฒ๋ฆฌ๊ธฐ๊ฐ ์คํ ์ด์ง์ ์๋ UDF์ ๊ฒฝ์ฐ UDF๋ฅผ ํฌํจํ JAR ํ์ผ์ ์์น๋ฅผ ์ง์ ํด์ฃผ๋ IMPORTS ์ ์ด ํ์ํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์ธ๋ผ์ธ ์ํ์ธ UDF์ ๊ฒฝ์ฐ, ์ธ๋ผ์ธ UDF๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ ์คํธ ํ์ผ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ์ผ์ ์ก์ธ์คํด์ผ ํ ๋๋ง IMPORTS ์ ์ด ํ์ํฉ๋๋ค.
Snowpark ํจํค์ง ์ ๊ฐ์ Snowflake ์์คํ ํจํค์ง์ ๊ฒฝ์ฐ JAR ํ์ผ์ IMPORTS ๋ก ์ง์ ํ๋ ๋์ PACKAGES ์ ๋ก ํจํค์ง๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ ํจํค์ง JAR ํ์ผ์ IMPORTS ๊ฐ์ ํฌํจํ ํ์๋ ์์ต๋๋ค.
์ธ๋ผ์ธ Java
AS function_definition
์ธ๋ผ์ธ Java UDFs๋ ํจ์ ์ ์ ๊ฐ ํ์์ ์ ๋๋ค.
HANDLER = handler_name
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ๋๋ ํด๋์ค์ ์ด๋ฆ์ ๋๋ค.
์ฒ๋ฆฌ๊ธฐ๊ฐ ํ ์ด๋ธ ํ์์ด ์๋ ๊ฐ์ ๋ฐํํ๋ ์ค์นผ๋ผ UDF์ ์ฒ๋ฆฌ๊ธฐ์ธ ๊ฒฝ์ฐ HANDLER ๊ฐ์
MyClass.myMethod
ํ์์์์ฒ๋ผ ๋ฉ์๋ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค.ํธ๋ค๋ฌ๊ฐ ํ ์ด๋ธ ํ์์ UDF์ธ ๊ฒฝ์ฐ HANDLER ๊ฐ์ ํธ๋ค๋ฌ ํด๋์ค์ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค.
JavaScriptยถ
LANGUAGE JAVASCRIPT
์ฝ๋๊ฐ JavaScript ์ธ์ด๋ก ๋์ด ์์์ ์ง์ ํฉ๋๋ค.
Pythonยถ
LANGUAGE PYTHON
์ฝ๋๊ฐ Python ์ธ์ด๋ก ๋์ด ์์์ ์ง์ ํฉ๋๋ค.
RUNTIME_VERSION = python_version
์ฌ์ฉํ Python ๋ฒ์ ์ ์ง์ ํฉ๋๋ค. ์ง์๋๋ Python ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
3.9
3.10
3.11
3.12
IMPORTS = ( 'stage_path_and_file_name_to_read' [ , ... ] )
๊ฐ์ ธ์ฌ ํ์ผ์ ์์น(์คํ ์ด์ง), ๊ฒฝ๋ก, ์ด๋ฆ์ ๋๋ค.
ํ์ผ์
.py
ํ์ผ ๋๋ ๋ค๋ฅธ ์ ํ์ ํ์ผ์ผ ์ ์์ต๋๋ค.Python UDF๋ ํ ์คํธ ํ์ผ๊ณผ ๊ฐ์ Python ํ์ผ ์ด์ธ์ ํ์ผ๋ ์ฝ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ณด๋ ค๋ฉด ํ์ผ ์ฝ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํ์ผ์ ์คํ ์ด์ง๋ก ๋ณต์ฌํ๋ ค๋ ๊ฒฝ์ฐ Snowflake์์๋ ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ PUT ๋ช ๋ น์ด ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง๋ก์ ํ์ผ ๋ณต์ฌ๋ฅผ ์ง์ํ๊ณ PUT ๋ช ๋ น์ด ๋ณดํต์ ํ์ผ์ ์คํ ์ด์ง๋ก ๊ฐ์ฅ ์ฝ๊ฒ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ธ๋ถ ์คํ ์ด์ง๊ฐ ํ์ฉ๋์ง๋ง, PUT ์ ์ง์์ ๋ฐ์ง ์์ต๋๋ค.
ํ์ผ์ด ๋ค๋ฅธ ํ์ ๋๋ ํฐ๋ฆฌ๋ ๋ค๋ฅธ ์คํ ์ด์ง์ ์๋๋ผ๋ IMPORTS ์ ์ ๊ฐ ํ์ผ์ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
ํธ๋ค๋ฌ ์ฝ๋๊ฐ ์คํ ์ด์ง์ ์ ์ฅ๋์ด ์์ผ๋ฉด IMPORTS ์ ์ ์ฌ์ฉํ์ฌ ํธ๋ค๋ฌ ์ฝ๋์ ์์น๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
์ธ๋ผ์ธ Python UDF์ ๊ฒฝ์ฐ, UDF ํธ๋ค๋ฌ๊ฐ ํจํค์ง ๋๋ ํ ์คํธ ํ์ผ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ์ผ์ ์ก์ธ์คํด์ผ ํ ๋๋ง IMPORTS ์ ์ด ํ์ํฉ๋๋ค.
numpy ๊ณผ ๊ฐ์ Snowflake ์์คํ ์ ํฌํจ๋ ํจํค์ง์ ๊ฒฝ์ฐ, PACKAGES ์ ๋ง ์ฌ์ฉํด ํจํค์ง๋ฅผ ์ง์ ํ์ฌ ํจํค์ง ์๋ณธ์ IMPORTS ๊ฐ์ผ๋ก ์๋ตํ ์ ์์ต๋๋ค.
HANDLER = handler_name
์ฒ๋ฆฌ๊ธฐ ํจ์ ๋๋ ํด๋์ค์ ์ด๋ฆ์ ๋๋ค.
ํธ๋ค๋ฌ๊ฐ ์ค์นผ๋ผ UDF์ฉ์ผ๋ก, ํ ์ด๋ธ ํ์์ด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒฝ์ฐ, HANDLER ๊ฐ์ ํจ์ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค. ํธ๋ค๋ฌ ์ฝ๋๊ฐ CREATE FUNCTION ๋ฌธ๊ณผ ์ธ๋ผ์ธ์ผ ๊ฒฝ์ฐ ํจ์ ์ด๋ฆ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ํธ๋ค๋ฌ ์ฝ๋๊ฐ ์คํ ์ด์ง์์ ์ฐธ์กฐ๋ ๋ ์ด ๊ฐ์
my_module.my_function
ํ์์์์ฒ๋ผ ๋ชจ๋ ์ด๋ฆ์ผ๋ก ์ ๊ทํ๋์ด์ผ ํฉ๋๋ค.ํธ๋ค๋ฌ๊ฐ ํ ์ด๋ธ ํ์์ UDF์ธ ๊ฒฝ์ฐ HANDLER ๊ฐ์ ํธ๋ค๋ฌ ํด๋์ค์ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค.
Scalaยถ
LANGUAGE SCALA
์ฝ๋๊ฐ Scala ์ธ์ด๋ก ๋์ด ์์์ ์ง์ ํฉ๋๋ค.
RUNTIME_VERSION = scala_version
์ฌ์ฉํ Scala ๋ฐํ์ ๋ฒ์ ์ ์ง์ ํฉ๋๋ค. ์ง์๋๋ Scala ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
2.12
RUNTIME_VERSION ์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ Scala 2.12๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
IMPORTS = ( 'stage_path_and_file_name_to_read' [ , ... ] )
JAR ๋๋ ๋ค๋ฅธ ์ข ๋ฅ์ ํ์ผ๊ณผ ๊ฐ์ด, ๊ฐ์ ธ์ฌ ํ์ผ์ ์์น(์คํ ์ด์ง), ๊ฒฝ๋ก, ์ด๋ฆ์ ๋๋ค.
JAR ํ์ผ์๋ ์ฒ๋ฆฌ๊ธฐ ์ข ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ํ๋ ์ด์์ .class ํ์ผ๊ณผ 0๊ฐ ๋๋ ๊ทธ ์ด์์ ๋ฆฌ์์ค ํ์ผ์ ํฌํจํ ์ ์์ต๋๋ค.
JNI(Java ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค)๋ ์ง์๋์ง ์์ต๋๋ค. Snowflake๋ (Java ๋ฐ์ดํธ ์ฝ๋์๋ ๋์กฐ์ ์ผ๋ก) ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ฉํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค.
JAR ํ์ผ์ด ์๋ ํ์ผ์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ฝ์ ํ์ผ์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ณด๋ ค๋ฉด IMPORTS์์ ์ ์ ์ผ๋ก ์ง์ ๋ ํ์ผ ์ฝ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํ์ผ์ ์คํ ์ด์ง๋ก ๋ณต์ฌํ๋ ค๋ ๊ฒฝ์ฐ Snowflake์์๋ ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ PUT ๋ช ๋ น์ด ๋ช ๋ช ๋ ๋ด๋ถ ์คํ ์ด์ง๋ก์ ํ์ผ ๋ณต์ฌ๋ฅผ ์ง์ํ๊ณ PUT ๋ช ๋ น์ด ๋ณดํต์ JAR ํ์ผ์ ์คํ ์ด์ง๋ก ๊ฐ์ฅ ์ฝ๊ฒ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ธ๋ถ ์คํ ์ด์ง๊ฐ ํ์ฉ๋์ง๋ง, PUT ์ ์ง์์ ๋ฐ์ง ์์ต๋๋ค.
ํ์ผ์ด ๋ค๋ฅธ ์คํ ์ด์ง ํ์ ๋๋ ํฐ๋ฆฌ๋ ๋ค๋ฅธ ์คํ ์ด์ง์ ์๋๋ผ๋ IMPORTS ์ ์ ๊ฐ ํ์ผ์ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
IMPORTS ๋ฐ TARGET_PATH ์ ์ด ๋ชจ๋ ์๋ ๊ฒฝ์ฐ, ํ์ผ์ด ๋ค๋ฅธ ์คํ ์ด์ง ํ์ ๋๋ ํฐ๋ฆฌ๋ ๋ค๋ฅธ ์คํ ์ด์ง์ ์๋๋ผ๋ TARGET_PATH ์ ์ ํ์ผ ์ด๋ฆ์ IMPORTS ์ ์ ๋์ด๋ ํ์ผ์ ์ด๋ฆ๊ณผ ๋ฌ๋ผ์ผ ํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ๊ฐ ์คํ ์ด์ง์ ์๋ UDF์ ๊ฒฝ์ฐ UDF๋ฅผ ํฌํจํ JAR ํ์ผ์ ์์น๋ฅผ ์ง์ ํด์ฃผ๋ IMPORTS ์ ์ด ํ์ํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์ธ๋ผ์ธ ์ํ์ธ UDF์ ๊ฒฝ์ฐ, ์ธ๋ผ์ธ UDF๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ ์คํธ ํ์ผ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ์ผ์ ์ก์ธ์คํด์ผ ํ ๋๋ง IMPORTS ์ ์ด ํ์ํฉ๋๋ค.
Snowpark ํจํค์ง ์ ๊ฐ์ Snowflake ์์คํ ํจํค์ง์ ๊ฒฝ์ฐ JAR ํ์ผ์ IMPORTS ๋ก ์ง์ ํ๋ ๋์ PACKAGES ์ ๋ก ํจํค์ง๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ ํจํค์ง JAR ํ์ผ์ IMPORTS ๊ฐ์ ํฌํจํ ํ์๋ ์์ต๋๋ค.
์ธ๋ผ์ธ Scala
AS function_definition
์ธ๋ผ์ธ Scala ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์๋ UDF์๋ ํจ์ ์ ์ ๊ฐ ํ์ํฉ๋๋ค.
HANDLER = handler_name
์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋ ๋๋ ํด๋์ค์ ์ด๋ฆ์ ๋๋ค.
์ฒ๋ฆฌ๊ธฐ๊ฐ ํ ์ด๋ธ ํ์์ด ์๋ ๊ฐ์ ๋ฐํํ๋ ์ค์นผ๋ผ UDF์ ์ฒ๋ฆฌ๊ธฐ์ธ ๊ฒฝ์ฐ HANDLER ๊ฐ์
MyClass.myMethod
ํ์์์์ฒ๋ผ ๋ฉ์๋ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค.
์ ํ์ ๋งค๊ฐ ๋ณ์ยถ
๋ชจ๋ ์ธ์ดยถ
SECURE
ํจ์๊ฐ ์์ ํ ๊ฒ์ผ๋ก ์ง์ ํฉ๋๋ค. ๋ณด์ ํจ์์ ๋ํ ์์ธํ ๋ด์ฉ์ Secure UDF์ ์ ์ฅ ํ๋ก์์ ๋ก ๋ฏผ๊ฐํ ์ ๋ณด ๋ณดํธํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
{ TEMP | TEMPORARY }
ํจ์๊ฐ ํด๋น ํจ์๋ฅผ ์์ฑํ ์ธ์ ์ ์ง์ ๊ธฐ๊ฐ ๋์๋ง ์ง์๋๋๋ก ์ง์ ํฉ๋๋ค. ์์ ํจ์๋ ์ธ์ ์ด ๋๋๋ฉด ์ญ์ ๋ฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ: ๊ฐ ์์.
TEMPORARY
๋ก ์ ์ธ๋์ง ์์ ํจ์๋ ์๊ตฌ์ ์ ๋๋ค.์คํค๋ง์ ์ด๋ฏธ ์กด์ฌํ๋ ํจ์์ ์ด๋ฆ์ด ๊ฐ์ ์์ ์ฌ์ฉ์ ์ ์ ํจ์ ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
[ [ NOT ] NULL ]
ํจ์๊ฐ NULL ๊ฐ์ ๋ฐํํ ์ ์๊ฑฐ๋ NON-NULL ๊ฐ๋ง ๋ฐํํด์ผ ํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ NULL์ ๋๋ค(์ฆ, ์ด ํจ์๋ NULL์ ๋ฐํํ ์ ์์).
์ฐธ๊ณ
ํ์ฌ,
NOT NULL
์ ์ SQL UDFs์ ๋ํด ์ ์ฉ๋์ง ์์ต๋๋ค.NOT NULL
๋ก ์ ์ธ๋ SQL UDFs๋ NULL ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. Snowflake๋ NULL ๊ฐ์ด ์ ๋ ๋ฐํ๋์ง ์๋๋ก ํจ์์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์ ๊ฒฝ์ฐ SQL UDFs์ ๋ํดNOT NULL
์ ํผํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
CALLED ON NULL INPUT
๋๋ .{ RETURNS NULL ON NULL INPUT | STRICT }
null ์ ๋ ฅ์ผ๋ก ํธ์ถ ์ UDF์ ๋์์ ์ง์ ํฉ๋๋ค. ์ ๋ ฅ๊ฐ์ด null์ผ ๋ ํญ์ null์ ๋ฐํํ๋ ์์คํ ์ ์ ํจ์์๋ ๋ฐ๋๋ก, UDFs๋ null ์ ๋ ฅ์ ์ฒ๋ฆฌํ์ฌ ์ ๋ ฅ๊ฐ์ด null์ผ ๋๋ null์ด ์๋ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.
CALLED ON NULL INPUT
์ ํญ์ null ์ ๋ ฅ์ผ๋ก UDF๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ์ ๊ฐ์ ๊ฐ์ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ UDF์ ๋ฌ๋ ค ์์ต๋๋ค.์ ๋ ฅ๊ฐ์ด null์ธ ๊ฒฝ์ฐ
RETURNS NULL ON NULL INPUT
(๋๋ ๊ทธ ๋์์ด์ธSTRICT
)์ UDF๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค. ๋์ , ํด๋น ํ์ ๋ํด ํญ์ null ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. UDF๋ null์ด ์๋ ์ ๋ ฅ๊ฐ์ ๋ํด ์ฌ์ ํ null์ ๋ฐํํ ์๋ ์์ต๋๋ค.
์ฐธ๊ณ
SQL UDF์ ๋ํด
RETURNS NULL ON NULL INPUT
(STRICT
)์ด ์ง์๋์ง ์์ต๋๋ค. SQL UDF๋ ์ฌ์ค์CALLED ON NULL INPUT
์ ์ฌ์ฉํฉ๋๋ค. SQL UDF์์ null ์ ๋ ฅ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.๊ธฐ๋ณธ๊ฐ:
CALLED ON NULL INPUT
{ VOLATILE | IMMUTABLE }
๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๋ UDF์ ๋์์ ์ง์ ํฉ๋๋ค.
VOLATILE
: (์: ๋น๊ฒฐ์ ์ฑ ๋ฐ ์ํ ์ ์ฅ์ผ๋ก ์ธํด) UDF๋ ๋๊ฐ์ ์ ๋ ฅ์ ๋ํด์๋ ๋ค๋ฅธ ํ์ ๋ํด ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.IMMUTABLE
: UDF๋ ๊ฐ์ ์ ๋ ฅ์ผ๋ก ํธ์ถ ์ ํจ์๊ฐ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด ๋ณด์ฆ์ ํ์ธ๋์ง ์์ต๋๋ค. ๊ฐ์ ์ ๋ ฅ์ ๋ํด ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ๋ UDF์ ๋ํดIMMUTABLE
์ ์ง์ ํ๋ฉด ์ ์๋์ง ์์ ๋์์ด ์ด๋ฃจ์ด์ง๋๋ค.
๊ธฐ๋ณธ๊ฐ:
VOLATILE
์ฐธ๊ณ
IMMUTABLE์ ์ง๊ณ ํจ์์์ ์ง์๋์ง ์์ต๋๋ค(AGGREGATE ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ). ๋ฐ๋ผ์ ๋ชจ๋ ์ง๊ณ ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก VOLATILE์ ๋๋ค.
COMMENT = 'string_literal'
SHOW FUNCTIONS ๋ฐ SHOW USER FUNCTIONS ์ถ๋ ฅ์ DESCRIPTION ์ด์ ํ์๋๋ UDF์ ๋ํ ์ค๋ช ์ ์ง์ ํฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ:
user-defined function
COPY GRANTS
CREATE OR REPLACE FUNCTION์ ์ฌ์ฉํ์ฌ ์ ํจ์๋ฅผ ๋ง๋ค ๋ ์๋ ํจ์์ ์ก์ธ์ค ๊ถํ์ ์ ์งํ๋๋ก ์ง์ ํฉ๋๋ค.
์ด ๋งค๊ฐ ๋ณ์๋ OWNERSHIP์ ์ ์ธํ ๋ชจ๋ ๊ถํ์ ๊ธฐ์กด ํจ์์์ ์ ํจ์๋ก ๋ณต์ฌํฉ๋๋ค. ์ ํจ์๋ ์คํค๋ง์ ์ค๋ธ์ ํธ ์ ํ์ ๋ํด ์ ์๋ ํฅํ ๋ชจ๋ ๊ถํ ๋ถ์ฌ๋ฅผ ์์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, CREATE FUNCTION ๋ฌธ์ ์คํํ๋ ์ญํ ์ ์ ํจ์๋ฅผ ์์ ํฉ๋๋ค.
์ฐธ๊ณ :
๋ฐ์ดํฐ ๊ณต์ ์ฌ์ฉ ์, ๊ธฐ์กด ํจ์๊ฐ ๋ค๋ฅธ ๊ณ์ ์ ๊ณต์ ๋ ๊ฒฝ์ฐ ๋์ฒด ํจ์๋ ๊ณต์ ๋ฉ๋๋ค.
๋์ฒด ํจ์์ ๋ํ SHOW GRANTS ์ถ๋ ฅ์๋ CREATE FUNCTION ๋ฌธ์ด ์คํ๋ ๋ ํ์ฌ ํ์์คํฌํ๋ฅผ ํฌํจํ ์ด ๋ฌธ์ ์คํํ ์ญํ ๋ก์ ๋ณต์ฌ๋ ๊ถํ์ ํผ๋ถ์ฌ์๊ฐ ๋์ด๋ฉ๋๋ค.
๊ถํ ๋ถ์ฌ ๋ณต์ฌ ์์ ์ CREATE FUNCTION ๋ช ๋ น์์ ์์์ ์ผ๋ก(์ฆ, ๊ฐ์ ํธ๋์ญ์ ๋ด์์) ๋ฐ์ํฉ๋๋ค.
Javaยถ
PACKAGES = ( 'package_name_and_version' [ , ... ] )
์ข ์ ํญ๋ชฉ์ผ๋ก ํ์ํ Snowflake ์์คํ ํจํค์ง์ ์ด๋ฆ ๋ฐ ๋ฒ์ ๋ฒํธ. ๊ฐ์
package_name:version_number
ํ์์ด์ด์ผ ํ๋ฉฐ, ์ฌ๊ธฐ์package_name
์snowflake_domain:package
์ ๋๋ค. Snowflake๊ฐ ์์คํ ์์ ์ ๊ณต๋๋ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉดlatest
๋ฅผ ๋ฒ์ ๋ฒํธ๋ก ์ง์ ํ ์ ์์ต๋๋ค.์:
-- Use version 1.2.0 of the Snowpark package. PACKAGES=('com.snowflake:snowpark:1.2.0') -- Use the latest version of the Snowpark package. PACKAGES=('com.snowflake:snowpark:latest')
Snowflake์์ ๋ค์ SQL์ ์คํํ์ฌ ์ง์๋๋ ์์คํ ํจํค์ง ๋ชฉ๋ก์ ๊ฒ์ํ ์ ์์ต๋๋ค.
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'java';
PACKAGES ๋ก ์ง์ ํ๋ ์ข ์์ฑ์ ๊ฒฝ์ฐ IMPORTS ์ ์ JAR ํ์ผ๋ ์ง์ ํ ํ์๋ ์์ต๋๋ค.
์ธ๋ผ์ธ Java
TARGET_PATH = stage_path_and_file_name_to_write
function_definition
์ ์ง์ ๋ ์ฒ๋ฆฌ๊ธฐ ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ JAR ํ์ผ์ Snowflake๊ฐ ์์ฑํ ์์น๋ฅผ ์ง์ ํฉ๋๋ค.์ด ์ ์ด ํฌํจ๋๋ฉด Snowflake๋ ๊ฒฐ๊ณผ๋ฌผ์ธ JAR ํ์ผ์ ์ ์ ๊ฐ์ผ๋ก ์ง์ ๋ ์คํ ์ด์ง ์์น์ ์๋๋ค. ์ด ์ ์ ์๋ตํ ๊ฒฝ์ฐ Snowflake๋ ์ฝ๋๊ฐ ํ์ํ ๋๋ง๋ค ์์ค ์ฝ๋๋ฅผ ๋ค์ ์ปดํ์ผํฉ๋๋ค. ์ด ๊ฒฝ์ฐ JAR ํ์ผ์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋์ง ์์ผ๋ฉฐ ์ฌ์ฉ์๋ JAR ํ์ผ์ ์ ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
Snowflake์์๋ TARGET_PATH ๊ฐ ๊ธฐ์กด ํ์ผ๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค. TARGET_PATH ๋ฅผ ์ฌ์ฉํด ๊ธฐ์กด ํ์ผ์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
์์ฑ๋ JAR ํ์ผ์ ์ฌ์ฉ์๊ฐ ํด๋น ํ์ผ์ ์ญ์ ํ๋๋ผ๋ ๋ช ์์ ์ผ๋ก ํจ์๋ฅผ ์ญ์ ํ ๋๊น์ง ์ ์ง๋ฉ๋๋ค. UDF ๋ฅผ ์ญ์ ํ ๋ JAR ์ ๋ ์ด์ UDF ๋ฅผ ์ง์ํ๋ ๋ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก JAR ํ์ผ์ ๋ณ๋๋ก ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ TARGET_PATH ์์ ์์๋
myhandler.jar
ํ์ผ์ด ์์ฑ๋์ดhandlers
์คํ ์ด์ง๋ก ๋ณต์ฌ๋ณธ์ด ์์ฑ๋ฉ๋๋ค.TARGET_PATH = '@handlers/myhandler.jar'
UDF ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด REMOVE ๋ช ๋ น ์ ์คํํ๋ ๋ฑ ํด๋น ์ฒ๋ฆฌ๊ธฐ JAR ํ์ผ๋ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
REMOVE @handlers/myhandler.jar;
EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
์ด ํจ์์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์ธ๋ถ ๋คํธ์ํฌ์ ์ก์ธ์คํ๋ ค๋ฉด ํ์ํ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ ์ด๋ฆ์ ๋๋ค.
์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ์ธ๋ถ REST API์ ๊ฐ์ ์ธ๋ถ ๋คํธ์ํฌ๋ฅผ ์์ฒญํ ๋ ํธ๋ค๋ฌ ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ถ ์์น ๋ฐ ์๊ฒฉ ์ฆ๋ช (์๋ ๊ฒฝ์ฐ)์ ์ง์ ํ๋ ๋คํธ์ํฌ ๊ท์น ๋ฐ ์ํฌ๋ฆฟ ์ ์ง์ ํฉ๋๋ค.
SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
์ฒ๋ฆฌ๊ธฐ ์ฝ๋์ ์ํฌ๋ฆฟ์์ ์ ๋ณด๋ฅผ ๊ฒ์ํ ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํฌ๋ฆฟ์ ์ฐธ์กฐํ ์ ์๋๋ก ์ํฌ๋ฆฟ ์ด๋ฆ์ ๋ณ์์ ํ ๋นํฉ๋๋ค.
์ฌ๊ธฐ์ ์ง์ ํ๋ ์ํฌ๋ฆฟ์ ์ด CREATE FUNCTION ๋ช ๋ น์ EXTERNAL_ACCESS_INTEGRATIONS ๋งค๊ฐ ๋ณ์์ ๊ฐ์ผ๋ก ์ง์ ๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์์ ํ์ฉ๋์ด์ผ ํฉ๋๋ค.
์ด ๋งค๊ฐ ๋ณ์์ ๊ฐ์ ๋ค์ ๋ถ๋ถ์ ํฌํจํ ํ ๋น ์์ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ๋๋ค.
ํ์ฉ๋ ์ํฌ๋ฆฟ์ ์ด๋ฆ์ธ
secret_name
.EXTERNAL_ACCESS_INTEGRATIONS ๋งค๊ฐ ๋ณ์๋ก ์ง์ ๋ ํตํฉ์๋ ์ํฌ๋ฆฟ์ด ํฌํจ๋์ง ์์ SECRETS ๊ฐ์ ์ง์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ํฌ๋ฆฟ์์ ์ ๋ณด๋ฅผ ๊ฒ์ํ ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ฌ์ฉํ ๋ณ์์ธ
'secret_variable_name'
.
์๋ฅผ ํฌํจํ ์์ธํ ๋ด์ฉ์ ํจ์ ๋๋ ํ๋ก์์ ์์ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Pythonยถ
AGGREGATE
ํจ์๊ฐ ์ง๊ณ ํจ์์์ ์ง์ ํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์ง๊ณ ํจ์์ ๋ํ ์์ธํ ๋ด์ฉ์ Python ์ฌ์ฉ์ ์ ์ ์ง๊ณ ํจ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ
IMMUTABLE์ ์ง๊ณ ํจ์์์ ์ง์๋์ง ์์ต๋๋ค(AGGREGATE ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ). ๋ฐ๋ผ์ ๋ชจ๋ ์ง๊ณ ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก VOLATILE์ ๋๋ค.
ARTIFACT_REPOSITORY = repository_name
ํจ์์์ ์ฌ์ฉํ PyPI ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ฐ ์ฌ์ฉํ ๋ฆฌํฌ์งํ ๋ฆฌ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
Snowflake๋ ์ํฐํฉํธ ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ด๋ฌํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
ARTIFACT_REPOSITORY_PACKAGES = ( 'package_name' [ , ... ] )
ํจ์์ ์ค์นํ์ฌ ์ฌ์ฉํ ํจํค์ง์ ์ด๋ฆ ๋ชฉ๋ก์ ์ง์ ํฉ๋๋ค.
Snowflake๋ ์ํฐํฉํธ ์ด๋ฏธ์ง ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ด๋ฌํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
PACKAGES = ( 'package_name_and_version' [ , ... ] )
์ข ์ ํญ๋ชฉ์ผ๋ก ํ์ํ ํจํค์ง์ ์ด๋ฆ ๋ฐ ๋ฒ์ ๋ฒํธ. ๊ฐ์
package_name==version_number
ํ์์ด์ด์ผ ํฉ๋๋ค. ๋ฒ์ ๋ฒํธ๋ฅผ ์๋ตํ ๊ฒฝ์ฐ Snowflake๋ ์์คํ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ต์ ํจํค์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค.์:
-- Use version 1.2.2 of the NumPy package. PACKAGES=('numpy==1.2.2') -- Use the latest version of the NumPy package. PACKAGES=('numpy')
Snowflake์์ ๋ค์ SQL์ ์คํํ์ฌ ์ง์๋๋ ์์คํ ํจํค์ง ๋ชฉ๋ก์ ๊ฒ์ํ ์ ์์ต๋๋ค.
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'python';
ํฌํจ๋ ํจํค์ง์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ํํฐ ํจํค์ง ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
์ด ํจ์์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์ธ๋ถ ๋คํธ์ํฌ์ ์ก์ธ์คํ๋ ค๋ฉด ํ์ํ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ ์ด๋ฆ์ ๋๋ค.
์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ์ธ๋ถ REST API์ ๊ฐ์ ์ธ๋ถ ๋คํธ์ํฌ๋ฅผ ์์ฒญํ ๋ ํธ๋ค๋ฌ ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ถ ์์น ๋ฐ ์๊ฒฉ ์ฆ๋ช (์๋ ๊ฒฝ์ฐ)์ ์ง์ ํ๋ ๋คํธ์ํฌ ๊ท์น ๋ฐ ์ํฌ๋ฆฟ ์ ์ง์ ํฉ๋๋ค.
SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
์ฒ๋ฆฌ๊ธฐ ์ฝ๋์ ์ํฌ๋ฆฟ์์ ์ ๋ณด๋ฅผ ๊ฒ์ํ ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํฌ๋ฆฟ์ ์ฐธ์กฐํ ์ ์๋๋ก ์ํฌ๋ฆฟ ์ด๋ฆ์ ๋ณ์์ ํ ๋นํฉ๋๋ค.
์ฌ๊ธฐ์ ์ง์ ํ๋ ์ํฌ๋ฆฟ์ ์ด CREATE FUNCTION ๋ช ๋ น์ EXTERNAL_ACCESS_INTEGRATIONS ๋งค๊ฐ ๋ณ์์ ๊ฐ์ผ๋ก ์ง์ ๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์์ ํ์ฉ๋์ด์ผ ํฉ๋๋ค.
์ด ๋งค๊ฐ ๋ณ์์ ๊ฐ์ ๋ค์ ๋ถ๋ถ์ ํฌํจํ ํ ๋น ์์ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ๋๋ค.
ํ์ฉ๋ ์ํฌ๋ฆฟ์ ์ด๋ฆ์ธ
secret_name
.EXTERNAL_ACCESS_INTEGRATIONS ๋งค๊ฐ ๋ณ์๋ก ์ง์ ๋ ํตํฉ์๋ ์ํฌ๋ฆฟ์ด ํฌํจ๋์ง ์์ SECRETS ๊ฐ์ ์ง์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ํฌ๋ฆฟ์์ ์ ๋ณด๋ฅผ ๊ฒ์ํ ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ฌ์ฉํ ๋ณ์์ธ
'secret_variable_name'
.
์๋ฅผ ํฌํจํ ์์ธํ ๋ด์ฉ์ ํจ์ ๋๋ ํ๋ก์์ ์์ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
SQLยถ
MEMOIZABLE
ํจ์๊ฐ ๋ฉ๋ชจ์ด์ ์ด์ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ง์ ํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ฉ๋ชจ์ด์ ์ด์ ๊ฐ๋ฅ UDF ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Scalaยถ
PACKAGES = ( 'package_name_and_version' [ , ... ] )
์ข ์ ํญ๋ชฉ์ผ๋ก ํ์ํ Snowflake ์์คํ ํจํค์ง์ ์ด๋ฆ ๋ฐ ๋ฒ์ ๋ฒํธ. ๊ฐ์
package_name:version_number
ํ์์ด์ด์ผ ํ๋ฉฐ, ์ฌ๊ธฐ์package_name
์snowflake_domain:package
์ ๋๋ค. Snowflake๊ฐ ์์คํ ์์ ์ ๊ณต๋๋ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉดlatest
๋ฅผ ๋ฒ์ ๋ฒํธ๋ก ์ง์ ํ ์ ์์ต๋๋ค.์:
-- Use version 1.7.0 of the Snowpark package. PACKAGES=('com.snowflake:snowpark:1.7.0') -- Use the latest version of the Snowpark package. PACKAGES=('com.snowflake:snowpark:latest')
Snowflake์์ ๋ค์ SQL์ ์คํํ์ฌ ์ง์๋๋ ์์คํ ํจํค์ง ๋ชฉ๋ก์ ๊ฒ์ํ ์ ์์ต๋๋ค.
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'scala';
PACKAGES ๋ก ์ง์ ํ๋ ์ข ์์ฑ์ ๊ฒฝ์ฐ IMPORTS ์ ์ JAR ํ์ผ๋ ์ง์ ํ ํ์๋ ์์ต๋๋ค.
TARGET_PATH = stage_path_and_file_name_to_write
function_definition
์ ์ง์ ๋ ์ฒ๋ฆฌ๊ธฐ ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ JAR ํ์ผ์ Snowflake๊ฐ ์์ฑํ ์์น๋ฅผ ์ง์ ํฉ๋๋ค.์ด ์ ์ด ํฌํจ๋๋ฉด Snowflake๋ ๊ฒฐ๊ณผ๋ฌผ์ธ JAR ํ์ผ์ ์ ์ ๊ฐ์ผ๋ก ์ง์ ๋ ์คํ ์ด์ง ์์น์ ์๋๋ค. ์ด ์ ์ ์๋ตํ ๊ฒฝ์ฐ Snowflake๋ ์ฝ๋๊ฐ ํ์ํ ๋๋ง๋ค ์์ค ์ฝ๋๋ฅผ ๋ค์ ์ปดํ์ผํฉ๋๋ค. ์ด ๊ฒฝ์ฐ JAR ํ์ผ์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋์ง ์์ผ๋ฉฐ ์ฌ์ฉ์๋ JAR ํ์ผ์ ์ ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
Snowflake์์๋ TARGET_PATH ๊ฐ ๊ธฐ์กด ํ์ผ๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค. TARGET_PATH ๋ฅผ ์ฌ์ฉํด ๊ธฐ์กด ํ์ผ์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
์์ฑ๋ JAR ํ์ผ์ ์ฌ์ฉ์๊ฐ ํด๋น ํ์ผ์ ์ญ์ ํ๋๋ผ๋ ๋ช ์์ ์ผ๋ก ํจ์๋ฅผ ์ญ์ ํ ๋๊น์ง ์ ์ง๋ฉ๋๋ค. UDF ๋ฅผ ์ญ์ ํ ๋ JAR ์ ๋ ์ด์ UDF ๋ฅผ ์ง์ํ๋ ๋ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก JAR ํ์ผ์ ๋ณ๋๋ก ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ TARGET_PATH ์์ ์์๋
myhandler.jar
ํ์ผ์ด ์์ฑ๋์ดhandlers
์คํ ์ด์ง๋ก ๋ณต์ฌ๋ณธ์ด ์์ฑ๋ฉ๋๋ค.TARGET_PATH = '@handlers/myhandler.jar'
UDF ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด REMOVE ๋ช ๋ น ์ ์คํํ๋ ๋ฑ ํด๋น ์ฒ๋ฆฌ๊ธฐ JAR ํ์ผ๋ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
REMOVE @handlers/myhandler.jar;
์ก์ธ์ค ์ ์ด ์๊ตฌ ์ฌํญยถ
์ด ์์ ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ญํ ์๋ ์ต์ํ ๋ค์ ๊ถํ ์ด ์์ด์ผ ํฉ๋๋ค.
๊ถํ |
์ค๋ธ์ ํธ |
์ฐธ๊ณ |
---|---|---|
CREATE FUNCTION |
์คํค๋ง |
์ด ๊ถํ์ผ๋ก๋ง ์คํค๋ง์์ ์ฌ์ฉ์ ์ ์ ํจ์๋ง ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ฉํธ๋ฆญ ํจ์ ์์ฑ์ ํ์ฑํํ๋ ค๋ฉด ์ญํ ์ CREATE DATA METRIC FUNCTION ๊ถํ์ด ์์ด์ผ ํฉ๋๋ค. |
USAGE |
ํจ์ |
์๋ก ์์ฑํ ํจ์์ ๋ํ USAGE ๊ถํ์ ์ญํ ์ ๋ถ์ฌํ๋ฉด ํด๋น ์ญํ (์: ์ธ๋ถ ํ ํฐํ์ ๋ํ ๋ง์คํน ์ ์ฑ ์์ ์ ์ญํ )์ ๊ฐ์ง ์ฌ์ฉ์๊ฐ Snowflake์ ๋ค๋ฅธ ๊ณณ์์ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. |
USAGE |
์ธ๋ถ ์ก์ธ์ค ํตํฉ |
ํตํฉ(์๋ ๊ฒฝ์ฐ)์ ํ์ํ๋ฉฐ, EXTERNAL_ACCESS_INTEGRATIONS ๋งค๊ฐ ๋ณ์๋ก ์ง์ ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CREATE EXTERNAL ACCESS INTEGRATION ์น์ ์ ์ฐธ์กฐํ์ญ์์ค. |
READ |
์ํฌ๋ฆฟ |
SECRETS ๋งค๊ฐ ๋ณ์๋ก ์ง์ ๋ ์ํฌ๋ฆฟ(์๋ ๊ฒฝ์ฐ)์ ํ์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ด๋ ์ํฌ๋ฆฟ ๋ง๋ค๊ธฐ ๋ฐ ํจ์ ๋๋ ํ๋ก์์ ์์ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค. |
USAGE |
์คํค๋ง |
SECRETS ๋งค๊ฐ ๋ณ์๋ก ์ง์ ๋ ์ํฌ๋ฆฟ์ด ํฌํจ๋ ์คํค๋ง(์๋ ๊ฒฝ์ฐ)์ ํ์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ด๋ ์ํฌ๋ฆฟ ๋ง๋ค๊ธฐ ๋ฐ ํจ์ ๋๋ ํ๋ก์์ ์์ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ฌ์ฉํ๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค. |
์คํค๋ง์ ๋ชจ๋ ์ค๋ธ์ ํธ์ ๋ํด ์์ ์ ์ํํ๋ ค๋ฉด ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ์คํค๋ง์ ๋ํ USAGE ๊ถํ.
์ง์ ๋ ๊ถํ ์ธํธ๋ก ์ฌ์ฉ์ ์ง์ ์ญํ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์ฌ์ฉ์ ์ง์ ์ญํ ๋ง๋ค๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
๋ณด์ ์ค๋ธ์ ํธ ์ ๋ํด SQL ์์ ์ ์ํํ๊ธฐ ์ํ ์ญํ ๊ณผ ๊ถํ ๋ถ์ฌ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ ์ก์ธ์ค ์ ์ด์ ๊ฐ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ ๋ ธํธยถ
๋ชจ๋ ์ธ์ดยถ
function_definition
์๋ ํฌ๊ธฐ ์ ํ์ด ์์ต๋๋ค. ํ์ฉ ๊ฐ๋ฅํ ์ต๋ ํฌ๊ธฐ๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.function_definition
์ฃผ์์ ๊ตฌ๋ถ ๊ธฐํธ๋ ์์๋ฐ์ดํ ๋๋ ํ ์์ ๋ฌ๋ฌ ๊ธฐํธ์ผ ์ ์์ต๋๋ค.$$
๋ฅผ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ฌ์ฉํ๋ฉด ์์๋ฐ์ดํ๊ฐ ํฌํจ๋ ํจ์๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.ํจ์ ๋ณธ๋ฌธ์ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ์์๋ฐ์ดํ ๋ฌธ์์ธ ๊ฒฝ์ฐ ๋ฐ๋์
function_definition
๋ด์ ๋ชจ๋ ์์๋ฐ์ดํ(์: ๋ฌธ์์ด ๋ฆฌํฐ๋ด)๋ฅผ ์์๋ฐ์ดํ๋ก ์ด์ค์ผ์ดํํด์ผ ํฉ๋๋ค.๋ง์คํน ์ ์ฑ ์์ UDF๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด์ ๋ฐ์ดํฐ ํ์ , UDF, ๋ง์คํน ์ ์ฑ ์ด ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค. ์์ธํ ๋ด์ฉ์ ๋ง์คํน ์ ์ฑ ์ ์ฌ์ฉ์ ์ ์ ํจ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
UDF์ ํธ๋ค๋ฌ ์ฝ๋์ CURRENT_DATABASE ๋๋ CURRENT_SCHEMA ํจ์๋ฅผ ์ง์ ํ๋ฉด ํจ์๋ ์ธ์ ์ ์ฌ์ฉ ์ค์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ์คํค๋ง๊ฐ ์๋๋ผ UDF๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ์คํค๋ง๋ฅผ ๋ฐํํฉ๋๋ค.
๋ฉํ๋ฐ์ดํฐ ๊ด๋ จ:
์ฃผ์
๊ณ ๊ฐ์ Snowflake ์๋น์ค๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ธ ๋ฐ์ดํฐ(์ฌ์ฉ์ ์ค๋ธ์ ํธ ์ ์ธ), ๋ฏผ๊ฐํ ๋ฐ์ดํฐ, ์์ถ ํต์ ๋์ ๋ฐ์ดํฐ ๋๋ ๊ธฐํ ๊ท์ ๋ฐ์ดํฐ๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ก ์ ๋ ฅ๋์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Snowflake์ ๋ฉํ๋ฐ์ดํฐ ํ๋ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
OR REPLACE
๋ฐIF NOT EXISTS
์ ์ ์ํธ ๋ฐฐํ์ ์ ๋๋ค. ๋ ๋ฌธ์๋ฅผ ๊ฐ์ ๋ฌธ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.CREATE OR REPLACE <์ค๋ธ์ ํธ> ๋ฌธ์ ์์์ฑ์ ๋๋ค. ์ฆ, ์ค๋ธ์ ํธ๊ฐ ๋ฐ๋ ๋ ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ์ด์ ์ค๋ธ์ ํธ๊ฐ ์ญ์ ๋๊ณ ์ ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
Javaยถ
Java์์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ NULL ๊ฐ์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก, ์ด๋ฌํ ์ ํ์ ์ธ์์ ๋ํด NULL์ ์ ๋ฌํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
HANDLER ์ ์์ ๋ฉ์๋ ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
IMPORTS ๋ฐ TARGET_PATH ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํจํค์ง, ํด๋์ค ๋ฐ ํ์ผ ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
์คํ ์ด์ง ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
PACKAGES ์ ์ ์ฌ์ฉํ์ฌ Snowflake ์์คํ ์ ์ ์ข ์์ฑ์ ๋ํ ํจํค์ง ์ด๋ฆ๊ณผ ๋ฒ์ ๋ฒํธ(์: Snowpark์ ํจํค์ง ์ด๋ฆ๊ณผ ๋ฒ์ ๋ฒํธ)๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ข ์ ํญ๋ชฉ์ ๊ฒฝ์ฐ IMPORTS ์ ์ ์ฌ์ฉํ์ฌ ์ข ์ ํญ๋ชฉ JAR ํ์ผ์ ์ง์ ํฉ๋๋ค.
Snowflake๋ ๋ค์์ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
CREATE FUNCTION ๋ฌธ์ HANDLER์ ์ง์ ๋ JAR ํ์ผ์ด ์กด์ฌํ๊ณ ์ด ํ์ผ์๋ ์ง์ ๋ ํด๋์ค์ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
UDF ์ ์ธ์ ์ง์ ๋ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํ์ Java ๋ฉ์๋์ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํ๊ณผ ํธํ๋ฉ๋๋ค.
์ ํจ์ฑ ๊ฒ์ฌ๋ ํ๋ ์ค์ธ Snowflake ์จ์ดํ์ฐ์ค์ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์์ฑ ์ ๋๋ ์คํ ์ ์ํํ ์ ์์ต๋๋ค.
์์ฑ ์๊ฐ โ CREATE FUNCTION ๋ฌธ์ด ์คํ๋ ๋ ํ์ฑ ์ํ์ธ Snowflake ์จ์ดํ์ฐ์ค์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด UDF ๋ ์์ฑ ์์ ์ ์ ํจ์ฑ์ด ๊ฒ์ฌ๋ฉ๋๋ค.
์คํ ์๊ฐ โ ํ๋ ์ค์ธ Snowflake ์จ์ดํ์ฐ์ค์ ์ฐ๊ฒฐ๋์ด ์์ง ์์ ๊ฒฝ์ฐ UDF ๊ฐ ์์ฑ๋์ง๋ง ์ฆ์ ์ ํจ์ฑ์ด ๊ฒ์ฌ๋์ง ์์ผ๋ฉฐ, Snowflake๋ ๋ค์ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
Function <์ด๋ฆ> created successfully, but could not be validated since there is no active warehouse
JavaScriptยถ
Snowflake๋ UDF ์์ฑ ์์ ์๋ JavaScript ์ฝ๋์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ง ์์ต๋๋ค. ์ฆ, ์ฝ๋๊ฐ ์ ํจํ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด UDF ์์ฑ์ ์ฑ๊ณตํฉ๋๋ค. ์ฝ๋๊ฐ ์ ํจํ์ง ์์ผ๋ฉด ์ฟผ๋ฆฌ ์ UDF ๋ฅผ ํธ์ถํ ๋ Snowflake๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
Pythonยถ
HANDLER ์ ์์ ํธ๋ค๋ฌ ํจ์ ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
IMPORTS ์ ์์:
ํ์ผ ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
์คํ ์ด์ง ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
PACKAGES ์ ์ ์ฌ์ฉํ์ฌ ์ข ์์ฑ์ ๋ํ ํจํค์ง ์ด๋ฆ๊ณผ ๋ฒ์ ๋ฒํธ(์: Snowpark์ ํจํค์ง)๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ข ์ ํญ๋ชฉ์ ๊ฒฝ์ฐ IMPORTS ์ ์ ์ฌ์ฉํ์ฌ ์ข ์ ํญ๋ชฉ ํ์ผ์ ์ง์ ํฉ๋๋ค.
Snowflake๋ ๋ค์์ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
CREATE FUNCTION ๋ฌธ์ HANDLER์ ์ง์ ๋ ํจ์ ๋๋ ํด๋์ค๊ฐ ์กด์ฌํฉ๋๋ค.
UDF ์ ์ธ์ ์ง์ ๋ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํ์ ํธ๋ค๋ฌ์ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํ๊ณผ ํธํ๋ฉ๋๋ค.
Scalaยถ
HANDLER ์ ์์ ๋ฉ์๋ ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
IMPORTS ๋ฐ TARGET_PATH ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํจํค์ง, ํด๋์ค ๋ฐ ํ์ผ ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
์คํ ์ด์ง ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
PACKAGES ์ ์ ์ฌ์ฉํ์ฌ Snowflake ์์คํ ์ ์ ์ข ์์ฑ์ ๋ํ ํจํค์ง ์ด๋ฆ๊ณผ ๋ฒ์ ๋ฒํธ(์: Snowpark์ ํจํค์ง ์ด๋ฆ๊ณผ ๋ฒ์ ๋ฒํธ)๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ข ์ ํญ๋ชฉ์ ๊ฒฝ์ฐ IMPORTS ์ ์ ์ฌ์ฉํ์ฌ ์ข ์ ํญ๋ชฉ JAR ํ์ผ์ ์ง์ ํฉ๋๋ค.
Snowflake๋ ๋ค์์ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
CREATE FUNCTION ๋ฌธ์ HANDLER์ ์ง์ ๋ JAR ํ์ผ์ด ์กด์ฌํ๊ณ ์ด ํ์ผ์๋ ์ง์ ๋ ํด๋์ค์ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
UDF ์ ์ธ์ ์ง์ ๋ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํ์ Scala ๋ฉ์๋์ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํ๊ณผ ํธํ๋ฉ๋๋ค.
์ ํจ์ฑ ๊ฒ์ฌ๋ ํ๋ ์ค์ธ Snowflake ์จ์ดํ์ฐ์ค์ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์์ฑ ์ ๋๋ ์คํ ์ ์ํํ ์ ์์ต๋๋ค.
์์ฑ ์๊ฐ โ CREATE FUNCTION ๋ฌธ์ด ์คํ๋ ๋ ํ์ฑ ์ํ์ธ Snowflake ์จ์ดํ์ฐ์ค์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด UDF ๋ ์์ฑ ์์ ์ ์ ํจ์ฑ์ด ๊ฒ์ฌ๋ฉ๋๋ค.
์คํ ์๊ฐ โ ํ๋ ์ค์ธ Snowflake ์จ์ดํ์ฐ์ค์ ์ฐ๊ฒฐ๋์ด ์์ง ์์ ๊ฒฝ์ฐ UDF ๊ฐ ์์ฑ๋์ง๋ง ์ฆ์ ์ ํจ์ฑ์ด ๊ฒ์ฌ๋์ง ์์ผ๋ฉฐ, Snowflake๋ ๋ค์ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
Function <์ด๋ฆ> created successfully, but could not be validated since there is no active warehouse
SQLยถ
ํ์ฌ, NOT NULL ์ ์ SQL UDF์ ๋ํด ์ ์ฉ๋์ง ์์ต๋๋ค.
CREATE OR ALTER FUNCTION ์ฌ์ฉ๋ฒ ๋ ธํธยถ
ALTER FUNCTION ๋ช ๋ น์ ๋ชจ๋ ์ ํ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค.
FUNCTION ์ PROCEDURE ๋ก ๋ฐ๊พธ๊ฑฐ๋ PROCEDURE ๋ฅผ FUNCTION ์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ ๋ณํํ ์ ์์ต๋๋ค.
์์ FUNCTION ์ ์์๊ฐ ์๋ FUNCTION ์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ ์์๊ฐ ์๋ FUNCTION ์ ์์ FUNCTION ์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ ๋ณํํ ์ ์์ต๋๋ค.
์ผ๋ฐ FUNCTION ์ EXTERNAL FUNCTION ์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ EXTERNAL FUNCTION ์ ์ผ๋ฐ FUNCTION ์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ ๋ณํํ ์ ์์ต๋๋ค.
LANGUAGE, IMPORTS, RETURNS, HANDLER, RUNTIME_VERSION, PACKAGES, VOLATILITY, NULL_HANDLING, TARGET_PATH ์์ฑ์ ๋ณ๊ฒฝ์ ์ง์๋์ง ์์ต๋๋ค.
ํ๊ทธ ์ค์ ๋๋ ์ค์ ํด์ ๋ ์ง์๋์ง ์์ต๋๋ค. ๊ธฐ์กด ํ๊ทธ๋ CREATE OR ALTER FUNCTION ๋ฌธ์ ์ํด ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉฐ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
์ยถ
Javaยถ
๋ค์์ ์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์๋ CREATE FUNCTION์ ๊ธฐ๋ณธ์ ์ธ ์์ ๋๋ค.
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;
}
}';
๋ค์์ ์คํ ์ด์ง๋ ์ฒ๋ฆฌ๊ธฐ์ ๋ํ ์ฐธ์กฐ๊ฐ ์๋ CREATE FUNCTION์ ๊ธฐ๋ณธ์ ์ธ ์์ ๋๋ค.
create function my_decrement_udf(i numeric(9, 0))
returns numeric
language java
imports = ('@~/my_decrement_udf_package_dir/my_decrement_udf_jar.jar')
handler = 'my_decrement_udf_package.my_decrement_udf_class.my_decrement_udf_method'
;
Java UDFs์ ๋ ๋ง์ ์๋ ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
JavaScriptยถ
js_factorial
๋ก ๋ช
๋ช
๋ JavaScript UDF ๋ง๋ค๊ธฐ:
CREATE OR REPLACE FUNCTION js_factorial(d double)
RETURNS double
LANGUAGE JAVASCRIPT
STRICT
AS '
if (D <= 0) {
return 1;
} else {
var result = 1;
for (var i = 2; i <= D; i++) {
result = result * i;
}
return result;
}
';
Pythonยถ
๋ค์ ์์ ์ ์ฝ๋๋ ํธ๋ค๋ฌ ์ฝ๋๊ฐ udf
๋ก ์ธ๋ผ์ธ์ธ py_udf
ํจ์๋ฅผ ๋ง๋ญ๋๋ค.
CREATE OR REPLACE FUNCTION py_udf()
RETURNS VARIANT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.10'
PACKAGES = ('numpy','pandas','xgboost==1.5.0')
HANDLER = 'udf'
AS $$
import numpy as np
import pandas as pd
import xgboost as xgb
def udf():
return [np.__version__, pd.__version__, xgb.__version__]
$$;
๋ค์ ์์ ์ ์ฝ๋๋ @my_stage
์คํ
์ด์ง์ ์๋ sleepy.py
ํ์ผ์ ํธ๋ค๋ฌ๊ฐ ์๋ dream
ํจ์๋ฅผ ๋ง๋ญ๋๋ค.
CREATE OR REPLACE FUNCTION dream(i int)
RETURNS VARIANT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.10'
HANDLER = 'sleepy.snore'
IMPORTS = ('@my_stage/sleepy.py')
Scalaยถ
๋ค์์ ์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์๋ CREATE FUNCTION์ ๊ธฐ๋ณธ์ ์ธ ์์ ๋๋ค.
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER='Echo.echoVarchar'
AS
$$
class Echo {
def echoVarchar(x : String): String = {
return x
}
}
$$;
๋ค์์ ์คํ ์ด์ง๋ ์ฒ๋ฆฌ๊ธฐ์ ๋ํ ์ฐธ์กฐ๊ฐ ์๋ CREATE FUNCTION์ ๊ธฐ๋ณธ์ ์ธ ์์ ๋๋ค.
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
IMPORTS = ('@udf_libs/echohandler.jar')
HANDLER='Echo.echoVarchar';
Scala UDF์ ๋ ๋ง์ ์๋ Scala UDF ์ฒ๋ฆฌ๊ธฐ์ ์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
SQLยถ
์ํ ์์ pi์ ํ๋ ์ฝ๋๋ ๊ทผ์ฌ๊ฐ์ ๋ฐํํ๋ ๊ฐ๋จํ SQL ์ค์นผ๋ผ UDF ๋ง๋ค๊ธฐ:
CREATE FUNCTION pi_udf()
RETURNS FLOAT
AS '3.141592654::FLOAT'
;
ํ๋ ์ฝ๋๋ ๊ฐ์ ๋ฐํํ๋ ๊ฐ๋จํ SQL ํ ์ด๋ธ UDF ๋ง๋ค๊ธฐ:
CREATE FUNCTION simple_table_function ()
RETURNS TABLE (x INTEGER, y INTEGER)
AS
$$
SELECT 1, 2
UNION ALL
SELECT 3, 4
$$
;
SELECT * FROM TABLE(simple_table_function());
์ถ๋ ฅ:
SELECT * FROM TABLE(simple_table_function());
+---+---+
| X | Y |
|---+---|
| 1 | 2 |
| 3 | 4 |
+---+---+
์ฌ๋ฌ ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ฉํ๋ UDF ๋ง๋ค๊ธฐ:
CREATE FUNCTION multiply1 (a number, b number)
RETURNS number
COMMENT='multiply two numbers'
AS 'a * b';
์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ get_countries_for_user
๋ก ๋ช
๋ช
๋ SQL ํ
์ด๋ธ UDF ๋ง๋ค๊ธฐ:
CREATE OR REPLACE FUNCTION get_countries_for_user ( id NUMBER )
RETURNS TABLE (country_code CHAR, country_name VARCHAR)
AS 'SELECT DISTINCT c.country_code, c.country_name
FROM user_addresses a, countries c
WHERE a.user_id = id
AND c.country_code = a.country_code';
CREATE OR ALTER FUNCTION ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ํจ์๋ฅผ ๋ง๋ค๊ณ ๋ณ๊ฒฝํฉ๋๋คยถ
๋ ๊ฐ์ ์ซ์๋ฅผ ํ์ฉํ๋ multiply
ํจ์๋ฅผ ๋ง๋ญ๋๋ค.
CREATE OR ALTER FUNCTION multiply(a NUMBER, b NUMBER)
RETURNS NUMBER
AS 'a * b';
multiply
๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ค๋ช
์ ์ถ๊ฐํ๊ณ ํจ์๋ฅผ ๋ณด์ ์ค์ ํฉ๋๋ค.
CREATE OR ALTER SECURE FUNCTION multiply(a NUMBER, b NUMBER)
RETURNS NUMBER
COMMENT = 'Multiply two numbers.'
AS 'a * b';