처리기 코드를 인라인 또는 스테이지에 유지하기

SQL로 사용자 정의 함수(UDF)나 저장 프로시저를 생성할 때 처리기 코드가 이런 코드를 생성하는 SQL과 인라인인지 또는 SQL의 외부 코드인지(예: 스테이지의 파일에 있는 코드) 지정할 수 있습니다. 이 항목에서는 차이점에 대해 설명합니다.

이 항목의 내용:

실질적인 차이점

인라인 처리기의 장점

일반적으로 구현하기가 더 쉽습니다. 개발 도구를 사용하여 코드가 의도대로 작동하는지 확인한 후, 함수나 프로시저를 만들기 위해 실행하는 SQL 문에 코드를 복사하여 배포할 수 있습니다. 다른 곳에서 코드를 유지 관리할 필요 없이 SQL 문(예: ALTER FUNCTION 또는 ALTER PROCEDURE)으로 코드를 업데이트하여 그곳에서 바로 코드를 유지 관리할 수 있습니다.

스테이징된 처리기의 장점

스테이징된 처리기를 사용하면 다음과 같이 할 수 있습니다.

  • 이미 컴파일된 출력이 있지만 소스는 없을 때와 같은 경우에 이전에 컴파일한 코드를 사용할 수 있습니다.

  • 함수 또는 프로시저를 만드는 데 사용하는 SQL 문에 붙여넣기에는 너무 클 수도 있는 처리기 코드를 사용할 수 있습니다. 인라인 코드는 소스 코드 크기에 상한이 있습니다.

  • 여러 함수 또는 프로시저에서 처리기 코드를 재사용할 수 있습니다. 스테이징된 코드는 각 함수가 다른 UDF 또는 프로시저에서 사용될 수 있는 여러 처리기 함수를 포함할 수 있습니다. 여러 UDF 또는 프로시저를 만들면 이들이 각각 동일한 처리기 파일을 지정할 수 있지만, 해당 파일에 구현된 다른 처리기 함수를 지정할 수 있습니다.

    반대로 인라인 함수 또는 프로시저의 처리기는 일반적으로 호출 가능한 함수를 하나만 포함합니다. 호출 가능한 그 함수는 다른 함수를 호출할 수 있으며, 이러한 다른 함수는 같은 코드 파일이나 다른 스테이징된 코드 파일에서 정의할 수 있습니다.

  • 대부분의 개발 작업을 수행하기 위해 기존 테스트 및 디버깅 도구를 사용하는 것이 더 편리할 수 있습니다. 코드가 크거나 복잡한 경우 특히 그렇습니다.

인라인 처리기 사용하기

인라인 처리기를 사용할 때는 함수 또는 프로시저를 생성하는 SQL 문의 AS 절에 처리기 소스 코드를 포함합니다. 예를 들어 CREATE FUNCTION 또는 CREATE PROCEDURE 문 자체의 AS 절에 처리기 코드를 포함합니다.

AS 절 내에서는 코드를 작은따옴표 또는 한 쌍의 달러 기호($$)로 묶습니다. 소스 코드에 작은따옴표가 포함되어 있을 때와 같이, 이중 달러 기호를 사용하는 것이 더 쉬울 수 있습니다.

인라인 처리기 소스 코드를 컴파일해야 하는 경우(예: Java 또는 Scala로 작성된 처리기를 사용하여) Snowflake는 소스를 컴파일하고 나중에 사용할 수 있도록 출력(예: JAR 파일)을 저장합니다. 선택적으로 TARGET_PATH 절을 사용하여 결과 출력 파일의 위치를 지정할 수 있습니다.

Snowflake는 다음과 같은 방식으로 컴파일된 출력을 관리합니다.

  • SQL 문(예: CREATE FUNCTION)이 TARGET_PATH를 사용하여 출력 파일의 위치를 지정하는 경우 Snowflake는 코드를 한 번 컴파일하고 나중에 사용할 수 있도록 컴파일된 출력을 보관합니다.

  • SQL 문이 파일의 위치를 지정하지 않으면 Snowflake는 함수 또는 프로시저를 호출하는 각 SQL 문에 대해 코드를 다시 컴파일합니다. Snowflake는 SQL 문이 완료된 후 파일을 자동으로 정리합니다.

참고

인라인 Java 또는 Scala 처리기를 사용할 때 가장 좋은 방법은 TARGET_PATH 매개 변수의 값을 지정하는 것입니다. Snowflake는 프로시저 또는 UDF에 대한 각 호출에 대해 코드를 다시 컴파일하는 대신 처리기 코드의 컴파일된 결과를 재사용하므로 이를 통해 성능이 향상될 수 있습니다.

주의

처리기 코드가 인라인으로 정의되면 메타데이터로 캡처됩니다. 코드를 메타데이터로 캡처하지 않으려면 대신 스테이징된 처리기 를 사용하는 등 다른 방법으로 코드를 배포할 수 있습니다.

고객은 Snowflake Service를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.

Java 처리기를 사용하는 인라인 예제

다음 예제의 코드는 Java로 작성된 인라인 처리기로 MYPROC 저장 프로시저를 생성합니다. 이 처리기는 MyJavaClass 클래스의 run 메서드입니다.

CREATE OR REPLACE PROCEDURE MYPROC(fromTable STRING, toTable STRING, count INT)
  RETURNS STRING
  LANGUAGE JAVA
  RUNTIME_VERSION = '11'
  PACKAGES = ('com.snowflake:snowpark:latest')
  HANDLER = 'MyJavaClass.run'
  AS
  $$
    import com.snowflake.snowpark_java.*;

    public class MyJavaClass {
      public String run(Session session, String fromTable, String toTable, int count) {
        session.table(fromTable).limit(count).write().saveAsTable(toTable);
        return "SUCCESS";
      }
    }
  $$;
Copy

CREATE PROCEDURE 참조 정보는 CREATE PROCEDURE 섹션을 참조하십시오.

스테이징된 처리기 사용하기

스테이징된 처리기를 사용할 때는 IMPORTS 절을 사용하여 스테이지 등의 다른 위치에서 처리기를 참조합니다. 예를 들어 CREATE PROCEDURE 또는 CREATE FUNCTION과 같은 SQL 문의 IMPORTS 절로 처리기의 경로를 지정합니다.

함수 또는 프로시저에서 사용할 처리기 스테이징하기

다음은 함수 또는 프로시저가 실행되는 환경에 처리기 파일을 추가하는 방법에 대한 설명입니다.

  1. Java 또는 Scala로 작성된 처리기를 사용하는 것과 같이, 필요한 경우 스테이지에 업로드할 처리기 코드를 컴파일하고 패키징합니다. 빌드 도구에 대한 자세한 내용은 처리기 코드 패키징하기 섹션을 참조하십시오.

    Python으로 작성된 처리기의 경우 처리기 모듈 소스를 사용할 수 있습니다.

  2. 코드에 종속성을 사용할 수 있도록 만들기 에 설명된 것처럼 처리기 파일을 스테이지에 업로드합니다.

  3. 함수 또는 프로시저를 만들 때 처리기 파일을 참조하십시오.

    종속성 참조하기 에 설명된 대로 IMPORTS 절에서 처리기 파일을 참조합니다.

    다음 예제의 코드를 실행하면 처리기 MyClass.myFunction 이 Java로 작성된 my_udf 라는 UDF가 생성됩니다. 코드의 IMPORTS 절은 my_handler.jar 이라는 처리기 파일이 스테이지 하위 디렉터리 handlersmystage 스테이지에 있음을 지정합니다. 런타임에 Snowflake는 클래스 경로에 JAR을 추가합니다.

    CREATE FUNCTION my_udf(i NUMBER)
      RETURNS NUMBER
      LANGUAGE JAVA
      IMPORTS = ('@mystage/handlers/my_handler.jar')
      HANDLER = 'MyClass.myFunction'
    
    Copy

    CREATE FUNCTION 참조 정보는 CREATE FUNCTION 섹션을 참조하십시오.

경고 및 모범 사례

처리기 파일을 삭제하거나 이름을 바꾸면 더 이상 함수나 프로시저를 호출할 수 없습니다. 처리기 파일을 업데이트해야 하는 경우에는 다음과 같이 하십시오.

  • 먼저 처리기를 사용하는 함수 또는 프로시저에 대해 어떤 호출도 이루어지지 않는지 확인합니다.

  • PUT 명령을 사용하여 새 처리기 파일을 업로드합니다. 새 처리기 파일을 업로드할 때 이전 처리기 파일이 아직 스테이지에 있는 경우 PUT 명령의 OVERWRITE=TRUE 절을 사용하여 이전 처리기 파일을 덮어씁니다.