Collaboration Clean Rooms에서 사용자 지정 함수 업로드 및 사용¶
소개¶
모든 공동 작업자는 사용자 지정 Python UDFs 및 UDTFs를 협업에 업로드할 수 있습니다. 협업의 템플릿은 이러한 함수를 실행하여 복잡한 데이터 작업을 수행할 수 있습니다. 일반적인 사용에는 쿼리 내에서의 머신 러닝 또는 사용자 지정 데이터 조작이 포함됩니다. 업로드한 코드는 승인된 Python 패키지 번들 및 :ref:`Snowpark API 패키지 <label-dcr_snowpark_udf>`에서 패키지를 가져오고 사용할 수 있습니다.
참고
Python은 사용자 지정 UDFs에 대해 지원되는 유일한 코딩 언어입니다.
다음 섹션에서는 사용자 지정 함수를 업로드하고 사용하는 방법을 보여줍니다.
사용자 지정 코드 번들 정의 및 사용¶
사용자 지정 함수를 업로드하고 사용하는 방법은 다음과 같습니다.
코드 제출자:
:ref:`REGISTER_CODE_SPEC <label-dcr_collab_register_code_spec>`을 호출하여 :ref:`코드를 생성하고 등록 <label-dcr_collaboration_create_and_register_code_bundle>`합니다.
코드는 사양에서 인라인이거나 :ref:`스테이지에서 연결 <label-dcr_collab_code_bundles_staged_artifacts>`될 수도 있습니다.
템플릿의
code_specs배열에서 ID로 :ref:`코드 번들 사양을 참조하는 템플릿을 생성 <label-dcr_collaboration_create_and_register_code_bundle_template>`합니다. 이 예제와 같이 이 필드를 템플릿 및 매개 변수 필드의 피어로 추가합니다.템플릿을 등록한 다음 :ref:`템플릿을 협업에 연결 <label-dcr_collaboration_code_bundle_link_template>`합니다.
참고
Snowflake는 업로드된 코드에 보안 문제가 있는지 검사합니다. 보안 문제가 발견되면 코드와 포함된 템플릿이 협업에 추가되지 않습니다.
분석 실행기:
``RUN``을 호출하여 표준 방식으로 템플릿을 실행합니다.
중요
Snowflake는 업로드된 번들에 대한 보안 검사를 실행한 후 클린룸에 배포합니다. 보안 검사에 실패하면 템플릿과 번들 코드가 배포되지 않고 사용할 수 없게 됩니다.
코드 번들이 포함된 템플릿이 배포되어 사용할 준비가 되었는지 확인하려면 다음 단계를 따릅니다.
코드 번들을 배포하려는 클린룸 애플리케이션의 이름을 찾습니다.
DESCRIBE APPLICATION 응답에서
upgrade_state값을 확인합니다. 업그레이드 상태가 COMPLETE인 경우, 보안 검사를 통과하여 새 템플릿과 번들을 사용할 수 있습니다. 다음 예제와 같이 SQL을 사용하여 이전 단계의 명령에서 반환된 애플리케이션 이름을 전달합니다. SQL 코드:
코드 번들 사양 생성 및 등록¶
사용자 지정 코드를 업로드하는 첫 번째 단계는 코드 번들 사양을 생성하고 등록하는 것입니다.
사용자 지정 함수는 YAML 코드 번들 사양에 정의됩니다. 각 코드 번들은 템플릿에서 호출할 수 있는 하나 이상의 함수를 노출합니다. 코드 번들 사양은 사양에 코드를 인라인으로 포함하거나 :ref:`Snowflake 스테이지에 있는 코드에 연결 <label-dcr_collab_code_bundles_staged_artifacts>`할 수 있습니다.
공동 작업자는 번들 ID를 반환하는 ``REGISTRY.REGISTER_CODE_SPEC``을 호출하여 사양을 등록합니다. 모든 공동 작업자는 코드 번들을 등록하고 연결할 수 있습니다.
코드 번들이 협업에 연결되면 해당 코드 번들은 코드 번들을 연결하는 템플릿에 액세스할 수 있는 협업의 모든 사용자에게 표시됩니다. ``VIEW_CODE_SPECS``를 호출하여 협업에서 액세스 가능한 코드 번들을 나열합니다.
협업에서 코드 번들을 볼 수 있는 사용자는 해당 협업의 자체 템플릿에서 코드 번들을 보고 사용할 수 있습니다. 모든 인라인 코드는 협업의 모든 구성원이 볼 수 있지만, 스테이징된 아티팩트 코드는 공동 작업자가 볼 수 없습니다.
다음 코드 번들 사양은 normalize_value``라는 단일 Python UDF를 노출하며, 해당 사양에 정의된 ``normalize 함수를 호출합니다.
호출 템플릿 생성 및 등록¶
코드 사양이 등록된 후 공동 작업자는 이 코드 번들을 사용하는 템플릿을 등록합니다. 코드 번들을 사용하려면 번들 사양 ID를 템플릿의 code_specs 필드에 추가합니다.
템플릿은 cleanroom.spec_name$function_name 구문을 사용하여 사용자 지정 함수를 호출합니다. 리터럴 . 및 $ 이름 범위 지정 표시에 유의하세요.
참고
사양 ID가 아닌 사양 이름을 사용하여 템플릿에서 함수를 참조합니다.
다음 예제에서 템플릿은 custom_udf 코드 번들의 normalize_value 함수를 사용합니다.
협업에 템플릿 추가¶
표준 방식으로 협업에 함수를 호출하는 템플릿을 추가합니다. 자세한 내용은 템플릿 섹션을 참조하십시오.
Snowflake는 호출 템플릿이 협업에 추가될 때 유효성을 검사하고 협업에 업로드합니다. Snowflake는 업로드된 코드에 보안 문제가 있는지 검사한 후 코드를 설치합니다.
다음 예제에서는 기존 협업에 템플릿을 추가하는 요청을 보여줍니다.
코드 번들의 새 버전 제출¶
등록된 모든 코드 사양에는 계정의 모든 레지스트리에 대해 고유한 이름 + 버전이 있어야 합니다. 템플릿은 코드 사양의 특정 이름과 버전을 로드합니다. 새 버전의 코드를 생성하거나 사용하려면 code_specs 필드에서 새 코드 버전을 참조하는 새 버전의 템플릿을 제출해야 합니다. 템플릿 본문은 변경할 필요가 없습니다. 예:
1단계: 코드 번들의 버전 1을 사용합니다.
2단계: 코드 번들의 새 버전을 업데이트 및 등록한 다음, 새 버전을 사용하도록 템플릿을 업데이트합니다.
함수 이름에는 버전이 포함되지 않으므로 함수의 새 버전을 업로드할 때 템플릿 본문에서 호출 코드를 변경할 필요가 없습니다.
코드 번들 사양¶
이 사양은 템플릿에서 호출할 수 있는 하나 이상의 코드 함수 또는 프로시저의 번들을 정의합니다.
코드 번들 사양에는 최대 5개의 함수와 프로시저가 있습니다.
코드 번들 사양의 식별자에는 다음과 같은 일반적인 요구 사항이 있습니다.
이름: 문자로 시작하고 영숫자 문자와 밑줄만 포함하는 유효한 :doc:`Snowflake 식별자 </sql-reference/identifiers-syntax>`여야 합니다.
따옴표가 있는 식별자: 특수 문자가 포함된 이름에는 큰따옴표로 묶인 식별자가 지원됩니다.
대/소문자 구분: 따옴표가 없는 식별자는 대/소문자를 구분하지 않으며, 따옴표로 묶인 식별자는 대/소문자를 유지합니다.
api_version사용되는 Collaboration API의 버전입니다.
2.0.0여야 합니다.spec_type사양 유형 식별자입니다.
code_spec여야 합니다.name: identifier이 레지스트리 내에서 이 코드 번들 사양의 고유한 이름입니다. 최대 75자의 유효한 Snowflake 식별자 </sql-reference/identifiers-syntax>`여야 합니다. 템플릿에서 함수를 호출할 때 성 세그먼트로 사용됩니다. :samp:`cleanroom.{code_spec_name}${function_name}
version: version_id사용자 지정 버전 식별자입니다. 밑줄이 포함된 영숫자여야 하며, 최대 20자입니다.
- :samp:`description: {description_text}`(선택 사항)
코드 번들 사양에 대한 설명입니다(최대 1,000자).
- ``artifacts``(선택 사항)
함수 또는 프로시저에서 가져올 수 있는 스테이징된 파일이나 패키지의 목록으로, :ref:`처리기 함수를 통해 선택적으로 노출 <label-dcr_collab_code_bundles_staged_artifacts>`됩니다. 사양당 최대 5개입니다.
alias: identifier가져오기에서 이 아티팩트를 참조하기 위한 별칭입니다. 이 사양 내에서 이 별칭을 참조할 때 :samp:`cleanroom.{spec_name}${alias}`가 아닌 베어 별칭 이름을 사용합니다. 즉, 베어 함수 이름을 사용하여 이 사양의 다른 함수를 참조합니다.
stage_path: stage_path아티팩트 파일의 전체 스테이지 경로입니다(예:
@DB.SCHEMA.STAGE/path/file.whl).
스테이지는 내부 스테이지여야 합니다. 외부 스테이지는 지원되지 않습니다.
스테이지에는 DIRECTORY가 활성화되어 있어야 합니다. 아티팩트가 포함된 스테이지에는 ``DIRECTORY = TRUE``가 설정되어 있어야 합니다.
스테이지 경로 유형:
@[DB.]SCHEMA.STAGE/path/to/file.ext형식을 따라야 합니다.경로 통과 없음: 스테이지 경로에는
..또는 ````를 포함할 수 없습니다.이 아티팩트가 있어야 합니다. 파일은 코드 번들이 등록될 때 지정된 스테이지 경로에 있어야 합니다.
스테이지에는 SNOWFLAKE_SSE 서버 측 암호화가 활성화되어 있어야 합니다. 스테이지를 생성하거나 변경할 때 :code:`ENCRYPTION = (TYPE = ‘SNOWFLAKE_SSE’)`를 설정합니다.
스테이징된 코드 파일을 푸시, 삭제 또는 업데이트하는 경우 :samp:`ALTER STAGE {stage name} REFRESH`를 호출하여 협업에 스테이지의 최신 정보가 있는지 확인해야 합니다. 코드 업데이트는 버전이 할당되고 해시 체크섬이 계산되는 시점인 코드 사양을 등록하기 전에만 지원됩니다.
- ``functions``(프로시저가 정의되지 않은 경우 필수)
UDF 또는 UDTF 정의의 목록입니다.
name identifier호출 템플릿에 노출할 함수 이름입니다. 유효한 :doc:`Snowflake 식별자 </sql-reference/identifiers-syntax>`여야 합니다.
type함수 유형입니다.
UDF또는UDTF중 하나입니다.language함수 언어입니다. 현재는
PYTHON만 지원됩니다.- :samp:`runtime_version: {python_version}`(선택 사항)
사용할 Python 런타임 버전입니다. 지원되는 버전은 ``3.10``~``3.14``입니다.
handler: handler``name``이 호출된 경우 호출할 함수 코드의 처리기 함수 이름입니다.
- ``arguments``(선택 사항)
이름-유형 페어의 목록인 함수 인자입니다. 유형은 유효한 Snowflake SQL 유형이어야 합니다.
returns: sql_type반환 유형입니다. UDFs의 경우,
STRING또는 ``FLOAT``과 같은 SQL 유형을 사용합니다. UDTFs 의 경우TABLE(column_definitions)를 사용합니다.- ``packages``(선택 사항)
이 코드에서 사용하는 패키지 목록입니다. 해당 Anaconda Python 패키지 또는 해당 Snowpark API 패키지 <label-dcr_snowpark_udf>`일 수 있습니다. 예: ``snowflake-snowpark-python`,
numpy.- ``imports``(선택 사항)
가져올 아티팩트의 목록입니다. 이는 이 사양의 아티팩트 목록에 있는 별칭이어야 합니다.
- ``code_body``(선택 사항)
인라인 Python 코드입니다. 스테이징된 가져오기와 상호 배타적입니다. 최대 크기는 12MB입니다.
- :samp:`description: {description_text}`(선택 사항)
함수에 대한 설명입니다(최대 500자).
- ``procedures``(함수가 정의되지 않은 경우 필수)
저장 프로시저 정의의 목록입니다. 필드는
type필드가 없는 경우를 제외하고 ``functions``와 유사합니다.
API 참조¶
다음 프로시저는 협업에서 사용자 지정 코드 번들을 관리하는 데 사용됩니다.
REGISTER_CODE_SPEC¶
- 스키마:
REGISTRY
코드 번들을 등록합니다. 그러면 REGISTRY.CODE_SPECS 테이블의 클린룸 환경에 코드가 저장됩니다. 코드 사양이 등록되면 템플릿에서 사용할 수 있습니다.
등록된 모든 코드 사양에는 계정의 모든 레지스트리에 대해 고유한 이름 + 버전이 있어야 합니다.
구문¶
인자¶
반환¶
생성된 코드 번들 사양 ID입니다.
예¶
기본 레지스트리에 코드 번들을 등록합니다.
사용자 지정 레지스트리에 코드 번들을 등록합니다.
액세스 요구 사항¶
SAMOOHA_APP_ROLE 역할을 사용하지 않는 경우, 다음 권한 중 하나가 부여된 역할을 사용해야 합니다.
기본 레지스트리에 코드 사양을 등록하려면:
GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('REGISTER CODE SPEC', 'role name')
사용자 지정 레지스트리에 항목을 등록하려면:
자신이 생성한 모든 사용자 지정 레지스트리에 대한 읽기 및 쓰기 권한이 있습니다.
다른 사용자가 생성한 사용자 지정 레지스트리에 액세스하려면 :samp:`GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE(‘REGISTER’, ‘REGISTRY’, ‘MY_REGISTRY’, ‘{role name}’)`이 필요합니다.
VIEW_REGISTERED_CODE_SPECS¶
- 스키마:
REGISTRY
이 역할이 로컬 계정 레지스트리에 등록한 모든 코드 번들 사양을 나열합니다.
구문¶
인자¶
반환¶
이 계정에 등록한 모든 코드 번들의 세부 정보를 나열하는 테이블입니다. 테이블에는 다음 열이 포함됩니다.
CODE_SPEC_ID: 코드 번들 사양의 ID입니다.NAME: 코드 번들 사양 이름입니다.VERSION: 코드 번들 사양 버전입니다.CODE_SPEC: 코드 번들 사양의 전체 YAML 사양입니다.
예¶
액세스 요구 사항¶
SAMOOHA_APP_ROLE 역할을 사용하지 않는 경우, 다음 권한 중 하나가 부여된 역할을 사용해야 합니다.
기본 레지스트리에서 항목을 보려면:
GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('VIEW REGISTERED CODE SPECS', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('REVIEW COLLABORATION', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('CREATE COLLABORATION', 'role name')
특정 레지스트리의 항목을 보려면:
자신이 생성한 모든 사용자 지정 레지스트리에 대한 읽기 및 쓰기 권한이 있습니다.
다른 사용자가 생성한 사용자 지정 레지스트리에 액세스하려면 :samp:`GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE(‘READ’, ‘REGISTRY’, ‘MY_REGISTRY’, ‘{role name}’)`이 필요합니다.
VIEW_CODE_SPECS¶
- 스키마:
COLLABORATION
사용자가 생성했거나 지정된 협업에서 실행할 수 있는 템플릿에서 참조하는 모든 코드 번들 사양을 반환합니다.
구문¶
인자¶
collaboration_name협업의 ID입니다.
반환¶
지정된 협업에서 사용 가능한 코드 번들을 나열하는 테이블입니다. 테이블에는 다음 열이 포함됩니다.
CODE_SPEC_ID: 이 코드 번들 사양의 ID입니다.CODE_SPEC: 코드 번들 사양의 전체 YAML 사양입니다.SHARED_BY: 코드 번들 사양을 공유하는 공동 작업자 별칭입니다.
예¶
액세스 요구 사항¶
SAMOOHA_APP_ROLE 역할을 사용하지 않는 경우, 다음 권한 중 하나가 부여된 역할을 사용해야 합니다.
GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE('VIEW CODE SPECS', 'COLLABORATION', 'collaboration name', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('REVIEW COLLABORATION', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('CREATE COLLABORATION', 'role name')
사양 예제¶
코드 본문이 있는 인라인 UDF¶
인라인 Python 코드가 있는 간단한UDF:
사용자 정의 테이블 함수(UDTF)¶
이 YAML 예제는 여러 행을 반환하는 UDTF를 정의합니다.
휠 패키지가 있는 스테이징된 아티팩트¶
코드 사양의 스테이징된 코드에 연결하려면 :ref:`stage_path 설명서 요구 사항 <label-dcr_collab_code_bundle_spec_yaml>`을 확인하세요.
이 YAML 예제는 스테이징된 Python 휠 패키지를 사용합니다.
저장 프로시저¶
이 YAML 예제는 데이터 처리를 위한 저장 프로시저를 정의합니다.
여러 Python 파일을 스테이징된 아티팩트로¶
코드 사양의 스테이징된 코드에 연결하려면 :ref:`stage_path 설명서 요구 사항 <label-dcr_collab_code_bundle_spec_yaml>`을 확인하세요.
이 YAML 예제는 여러 스테이징된 Python 소스 파일을 사용합니다.
코드 번들 문제 해결하기¶
- 오류:
CodeSpecAlreadyExistsException- 원인:
동일한 이름과 버전의 코드 번들 사양이 이미 등록되어 있습니다.
- 해결책:
다른 버전을 사용하거나 기존 버전을 업데이트합니다.
- 오류:
SpecValidationError- 원인:
YAML이 스키마를 준수하지 않습니다.
- 해결책:
필수 필드와 형식을 확인합니다.
- 오류:
CodeSpecStageNotAccessibleError- 원인:
아티팩트에서 참조되는 스테이지에 액세스할 수 없습니다.
- 해결책:
스테이지에 대한 액세스 권한을 부여하거나 스테이지가 있는지 확인합니다.
- 오류:
CodeSpecArtifactNotFoundAtStageError- 원인:
지정된 스테이지 경로에서 파일을 찾을 수 없습니다.
- 해결책:
등록하기 전에 스테이지에 파일을 업로드합니다.
- 오류:
StageDirectoryNotEnabledError- 원인:
스테이지에는 DIRECTORY가 활성화되어 있지 않습니다.
- 해결책:
스테이지에서 디렉터리를 활성화합니다.
ALTER STAGE ... SET DIRECTORY = (ENABLE = TRUE)
- 오류:
CodeSpecNotFoundForOwnerException- 원인:
템플릿이 등록되지 않은 코드 번들 사양을 참조합니다.
- 해결책:
템플릿을 등록하기 전에 코드 번들 사양을 등록합니다.