Java UDF 소개

이 항목에서는 Java UDF를 소개하고 Java UDF 사용 시기를 결정하는 데 도움이 되는 정보를 제공합니다.

이 항목의 내용:

Java UDF란?

UDF(사용자 정의 함수)는 기본 제공 함수를 호출하는 것과 같은 방식으로 Snowflake에서 호출할 수 있는 사용자 작성 함수입니다.

Snowflake는 Java 등 여러 언어로 작성된 UDF를 지원합니다.

Java UDF에 전달된 각 행에 대해 UDF는 스칼라(즉, 단일) 값을 반환하거나, 테이블 함수로 정의된 경우 행 세트를 반환합니다.

UDF는 0개 이상의 매개 변수를 허용합니다.

사용자가 UDF를 호출하면 사용자는 UDF의 이름과 UDF의 매개 변수를 Snowflake에 전달합니다. UDF가 Java UDF인 경우, Snowflake는 JAR 파일에서 적절한 Java 코드(핸들러 메서드 라고 함)를 호출합니다. 그런 다음 핸들러 메서드는 출력을 Snowflake로 반환하고 Snowflake는 이를 다시 클라이언트로 전달합니다. 다음은 데이터 흐름을 단순화한 그림입니다.

UDF Data Flow

Java UDF는 새 코드와 기존 라이브러리에 대한 호출을 둘 다 포함할 수 있으므로 유연성과 코드 재사용을 모두 허용합니다. 예를 들어, 이미 Java에 데이터 분석 코드가 있는 경우, 이를 Java UDF에 통합할 수 있습니다.

Snowflake는 현재 다음 Java 버전에서 Java UDF 작성을 지원합니다.

  • 11.x

Java UDF 사용 시기 결정

이 섹션에서는 Java UDF의 장점과 제한 사항에 대해 설명합니다.

UDF를 쓸 수 있는 다른 잠재적인 언어에 대한 정보와 이러한 언어 간의 비교는 UDFs의 개요 를 참조하십시오.

Snowflake를 확장하는 다른 방법에 대한 정보는 다음을 참조하십시오.

Java UDF의 장점

Java UDF는 다음 중 하나 이상에 해당할 때 특히 적합합니다.

  • 사용할 수 있는 Java 코드(소스 또는 컴파일)가 이미 있습니다.

  • 코드는 표준 Java 라이브러리에 이미 존재하는 함수를 사용하거나 사용할 수 있습니다.

  • UDF를 지원하는 다른 언어만큼 또는 그보다 더 잘 Java를 알고 있습니다.

Java UDF에 대한 제한 사항

일반 제한 사항

  • Java 메서드는 표준 Java 라이브러리의 클래스와 메서드를 사용할 수 있지만, Snowflake 보안 제약 조건으로 인해 파일에 쓰는 것과 같은 일부 기능이 비활성화됩니다. 자세한 내용은 우수한 보안 관행 따르기 섹션을 참조하십시오.

  • Java UDF는 공유할 수 없습니다. Java UDF를 사용하는 데이터베이스 오브젝트도 공유할 수 없습니다. 예를 들어, 사용자는 다음을 수행할 수 없습니다.

    • Java UDF를 직접 공유합니다.

    • Java UDF를 호출하는 뷰를 공유합니다.

    • Java UDF를 호출하는 함수를 공유합니다.

    • Java UDF를 호출하는 마스킹 또는 행 액세스 정책으로 테이블을 공유합니다.

  • Java UDF에 USAGE 권한을 부여하는 경우, 수신자는 해당 UDF에서 가져온 파일의 내용을 볼 수 있습니다. Java UDF에 대한 USAGE 권한을 역할에 부여하고 해당 역할이 해당 Java UDF를 호출하는 문을 실행하는 경우, 동일한 문에 있는 모든 Java UDF는 USAGE 권한을 부여받은 Java UDF에서 가져온 모든 파일의 내용을 읽을 수 있습니다.

  • 데이터베이스 복제 는 아직 외부 또는 내부 스테이지를 포함하지 않습니다. 기본 데이터베이스 역할을 하도록 보조 데이터베이스를 승격할 때, 스테이지 오브젝트를 다시 만들고 내부 스테이지에서 누락된 모든 파일을 다시 가져와야 합니다. 파일은 원래 기본 데이터베이스와 동일한 경로 및 파일 이름을 가져야 합니다.

  • Java UDF 출력 행의 최대 크기는 16MB입니다.

복제에 대한 제한 사항

Java UDF를 포함하는 데이터베이스 또는 스키마가 복제될 때 Java UDF를 복제할 수 있습니다. 복제하려면 Java UDF가 다음 조건을 충족해야 합니다.

  • Java UDF가 스테이지(예: UDF의 JAR 파일을 포함하는 스테이지)를 참조하는 경우, 해당 스테이지는 복제되는 스키마(또는 데이터베이스) 외부에 있어야 합니다.

    다음과 같은 방법으로 Java UDF 및 해당 참조 스테이지를 별도의 스키마(및/또는 별도의 데이터베이스)에 보관할 수 있습니다.

    • Java UDF가 스테이지를 참조할 때마다, Java UDF의 스키마 또는 데이터베이스와는 다른 정규화된 스테이지 이름(예: 《my_db.my_schema.my_stage()》)을 사용하십시오. 복제 작업이 데이터베이스를 복제하는 경우, 스테이지 참조에는 데이터베이스와 스키마가 포함되어야 합니다. 복제 작업이 스키마를 복제하는 경우, 스테이지 참조에는 스키마(및 필요에 따라 데이터베이스)가 포함되어야 합니다.

    • 정규화되지 않은 스테이지 이름(현재 세션의 활성 데이터베이스 및 스키마를 암시적으로 사용)을 사용하여 참조 스테이지를 만들고, 세션의 현재 데이터베이스 및 스키마와 일치하지 않는 정규화된 이름을 사용하여 Java UDF를 만듭니다.

    • 사용자의 스테이지를 참조 스테이지로 사용합니다(사용자의 스테이지는 데이터베이스의 스테이지 또는 스키마의 스테이지와는 별개입니다).

스키마 또는 데이터베이스에 있는 하나 이상의 Java UDF가 필수 조건을 충족하지 않는 경우, 스키마 또는 데이터베이스를 계속 복제할 수 있지만, 비호환 Java UDF는 오류 또는 경고 메시지 없이 복제본에서 생략됩니다.

복제된 각 Java UDF는 원본과 동일한 정의를 갖습니다. 해당 정의에는 스테이지에 대한 모든 참조가 포함됩니다. Java UDF의 스테이지 참조는 정규화되어야 하므로, 복제되는 스키마 또는 데이터베이스에 상대적이지 않고 절대적입니다. 원본과 복제본이 모두 동일 스테이지와 파일을 가리키기 때문에 다음과 같습니다.

  • 스테이지를 삭제하거나 스테이지에서 필수 파일을 제거하면 원본 UDF와 복제된 UDF가 모두 비활성화됩니다.

  • 스테이지 또는 스테이지의 파일을 변경하면(예: JAR 파일을 최신 JAR 파일로 교체) 원본 UDF와 복제된 UDF 모두에 영향을 줍니다.