일반 Scala UDF 처리기 코딩 지침¶
이 항목에서는 Scala에서 처리기 코드를 작성하는 일반적인 지침을 설명합니다. 스칼라 함수 처리기와 관련된 정보는 Scala로 스칼라 UDF 작성하기 섹션을 참조하십시오.
프로젝트 구조화, 코드 패키징, 종속성 관리에 대한 제안 사항은 Scala UDF 처리기 프로젝트 및 패키징 섹션을 참조하십시오.
모범 사례¶
플랫폼 독립적인 코드를 작성하십시오.
특정 CPU 아키텍처(예: x86)를 가정하는 코드를 피하십시오.
특정 운영 체제를 가정하는 코드를 피하십시오.
초기화 코드를 실행해야 하지만, 호출하는 메서드에 이를 포함하지 않으려면 초기화 코드를 처리기 클래스의 컴패니언 오브젝트에 넣을 수 있습니다.
인라인 처리기를 사용할 때 가능하면 CREATE FUNCTION 또는 CREATE PROCEDURE TARGET_PATH 매개 변수의 값을 지정하십시오. 그러면 호출할 때마다 다시 컴파일하는 대신 이전에 생성된 처리기 코드 출력을 재사용하도록 Snowflake에 알려주게 됩니다. 자세한 내용은 인라인 처리기 사용하기 섹션을 참조하십시오.
처리기 작성하기¶
Scala로 작성된 처리기로 스칼라 UDF를 작성할 수 있습니다.
처리기는 Scala UDF에 전달된 각 행에 대해 한 번 호출됩니다. 클래스의 새 인스턴스는 각 행에 대해 만들어지지 않습니다. Snowflake는 동일한 인스턴스의 처리기 메서드를 두 번 이상 호출할 수 있습니다.
코드 실행을 최적화하기 위해, Snowflake 제한 시간 임계값은 처리기 클래스 또는 오브젝트를 초기화하는 데 걸리는 시간과 처리기 메서드를 실행하는 데 걸리는 시간이 다릅니다. Snowflake에서는 초기화가 더 오래 걸릴 수 있다는 가정하에 처리기 클래스 또는 오브젝트를 초기화할 시간을 더 많이 허용합니다. 여기에는 UDF를 로드하는 시간, 그리고 생성자가 정의된 경우 처리기 메서드의 포함 클래스의 생성자를 호출하는 시간이 포함됩니다.
오류 처리¶
일반적인 예외 처리 기술로 예외를 처리하여 처리기 메서드 내에서 오류를 포착할 수 있습니다.
메서드 내에서 예외가 발생하고 이 예외가 메서드에서 포착되지 않으면 Snowflake는 예외에 대한 스택 추적을 포함하는 오류를 발생시킵니다.
쿼리를 종료하고 SQL 오류를 생성하기 위해 예외를 포착하지 않고 명시적으로 예외를 발생시킬 수 있습니다. 예:
if (x < 0) throw new IllegalArgumentException("x must be non-negative.")
디버깅할 때 SQL 오류 메시지 텍스트에 값을 포함할 수 있습니다. 그러려면 다음을 수행하십시오.
전체 Scala 메서드 본문을 try-catch 블록에 넣습니다.
포착된 오류 메시지에 인자 값을 추가합니다.
확장 메시지와 함께 예외를 발생시킵니다.
민감한 데이터가 노출되지 않도록 하려면 JAR 파일을 프로덕션 환경에 배포하기 전에 인자 값을 제거하십시오.
데이터 타입 선택하기¶
처리기를 작성할 때 UDF의 매개 변수 및 반환 데이터 타입(SQL에서)과 잘 매핑되는 매개 변수 및 반환 데이터 타입(처리기 언어에서)을 선언해야 합니다.
UDF가 호출될 때 Snowflake는 UDF의 인자를 SQL 매개 변수 유형에서 처리기의 매개 변수 유형으로 변환합니다. 값을 반환할 때 Snowflake는 반환 값을 처리기의 반환 유형에서 UDF의 반환 유형으로 변환합니다.
Snowflake는 SQL 유형과 Scala 유형 간에 지원되는 매핑에 따라 유형 간에 값을 변환합니다. 이러한 매핑에 대한 자세한 내용은 SQL-Scala 데이터 타입 매핑 섹션을 참조하십시오.
Scala 변수의 데이터 타입을 선택할 때 Snowflake에서 전송(및 반환)될 수 있는 데이터의 가능한 최댓값 및 최솟값을 고려하십시오.
CREATE FUNCTION
으로 UDF 만들기¶
CREATE FUNCTION 명령을 사용하여 SQL로 UDF를 만들어 작성한 코드를 핸들러로 지정합니다. 명령 참조는 CREATE FUNCTION 섹션을 참조하십시오.
CREATE OR REPLACE FUNCTION <name> ( [ <arguments> ] )
RETURNS <type>
LANGUAGE SCALA
[ IMPORTS = ( '<imports>' ) ]
RUNTIME_VERSION = 2.12
[ PACKAGES = ( '<package_name>' [, '<package_name>' . . .] ) ]
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
HANDLER = '<handler_class>.<handler_method>'
[ AS '<scala_code>' ]
작성한 핸들러 코드를 UDF와 연결하려면 CREATE FUNCTION 실행 시 다음을 수행하십시오.
LANGUAGE를 SCALA으로 설정합니다.
핸들러 클래스가 스테이지와 같은 외부 위치에 있는 경우 IMPORTS 절 값을 핸들러 클래스의 경로와 이름으로 설정합니다.
RUNTIME_VERSION을 코드에서 필요한 Scala 런타임 버전으로 설정합니다.
PACKAGES 절 값을 핸들러 클래스에 필요한 하나 이상의 패키지(있는 경우)의 이름으로 설정합니다.
HANDLER 절 값을 처리기 오브젝트와 메서드의 이름으로 설정합니다.
처리기 코드가 CREATE FUNCTION과 함께 인라인으로 지정된 경우
AS '<scala_code>'
절이 필요합니다.