コラボレーションクリーンルームでのカスタム関数のアップロードと使用¶
概要¶
コラボレーターは、カスタムPythonのUDFsおよびUDTFsをコラボレーションにアップロードできます。コラボレーションのテンプレートは、これらの関数を実行して複雑なデータアクションを実行できます。一般的な使用法には、クエリ内の機械学習やカスタマイズされたデータ操作が含まれます。アップロードしたコードは、`承認済みのPythonパッケージバンドル<https://repo.anaconda.com/pkgs/snowflake/>`_および:ref:`SnowparkAPIパッケージ<label-dcr_snowpark_udf>`からパッケージをインポートして使用できます。
注釈
Pythonは、カスタム UDFs でサポートされている唯一のコーディング言語です。
次のセクションでは、カスタム関数をアップロードして使用する方法を説明します。
カスタムコードバンドルの定義と使用¶
カスタム関数をアップロードして使用する方法は次のとおりです。
コード送信者
REGISTER_CODE_SPEC。
コードは仕様内にインラインで記述するか、ステージからリンクできます。
テンプレートの``code_specs``配列内でIDによって:ref:
コードバンドル仕様を参照するテンプレートを作成します<label-dcr_collaboration_create_and_register_code_bundle_template>。この例に示すように、このフィールドをテンプレートおよびパラメーターフィールドと同列に追加します。テンプレートを登録してから、テンプレートをコラボレーションにリンクします。
注釈
Snowflakeは、アップロードされたコードのセキュリティ問題をスキャンします。セキュリティの問題が見つかった場合、コードとそれを含むテンプレートはコラボレーションに追加されません。
分析実行者:
``RUN``を呼び出して、標準的な方法でテンプレートを実行します。
重要
Snowflakeは、アップロードされたバンドルをクリーンルームにデプロイする前にセキュリティチェックを実行します。セキュリティチェックが失敗した場合、テンプレートとそのバンドルコードはデプロイされず、使用できません。
コードバンドルを含むテンプレートがデプロイされ、使用可能であることを確認するには、以下のステップを実行します。
コードバンドルをデプロイしようとしているクリーンルームアプリケーションの名前を見つけます。
DESCRIBE APPLICATIONの応答で``upgrade_state``の値を確認します。アップグレード状態がCOMPLETEの場合、セキュリティチェックに合格しており、新しいテンプレートとバンドルを使用できます。次の例のSQLコードのように、SQLを使用して前のステップのコマンドによって返されたアプリケーション名を渡します。
コードバンドル仕様の作成と登録¶
カスタムコードをアップロードする最初のステップは、コードバンドル仕様を作成して登録することです。
カスタム関数は、YAMLコードバンドル仕様で定義されます。各コードバンドルは、テンプレートから呼び出すことができる1つ以上の関数を公開します。コードバンドル仕様には、仕様内にコードをインラインで含めるか、:ref:`Snowflakeステージ上にあるコードにリンクする<label-dcr_collab_code_bundles_staged_artifacts>`ことができます。
コラボレーターは、``REGISTRY.REGISTER_CODE_SPEC``を呼び出して仕様を登録します。これにより、バンドルIDが返されます。どのようなロールを持つコラボレーターでも、コードバンドルを登録してリンクできます。
コードバンドルがコラボレーションにリンクされると、そのコードバンドルは、コードバンドルをリンクするテンプレートにアクセスできるコラボレーション内のすべてのユーザーに表示されます。``VIEW_CODE_SPECS``を呼び出して、コラボレーション内でアクセス可能なコードバンドルを一覧表示します。
コラボレーションでコードバンドルを表示できるユーザーは誰でも、そのコラボレーション内の自分のテンプレートでそれを表示して使用できます。インラインコードはコラボレーションのメンバーであれば誰でも表示できますが、ステージングされたアーティファクトコードはコラボレーターには表示されません。
その仕様で定義されている``normalize``関数を呼び出す、``normalize_value``という名前の単一のPythonUDFを公開するコードバンドル仕様は次のとおりです。
呼び出しテンプレートの作成と登録¶
コード仕様が登録された後、コラボレーターはこのコードバンドルを使用するテンプレートを登録します。コードバンドルを使用するには、テンプレートの``code_specs``フィールドにバンドル仕様IDを追加します。
テンプレートは、構文:samp:cleanroom.{spec_name}${function_name}`を使用してカスタム関数を呼び出します。リテラルの`.``および``$``の名前スコープマークに注意してください。
注釈
テンプレート内の関数を参照するには、仕様IDではなく仕様名を使用します。
以下の例では、テンプレートはコードバンドル``custom_udf``の関数``normalize_value``を使用します。
コラボレーションへのテンプレートの追加¶
標準的な方法で、関数を呼び出すテンプレートをコラボレーションに追加します。詳細については、 テンプレート をご参照ください。
呼び出しテンプレートがコラボレーションに追加されると、Snowflakeは検証を行い、コラボレーションにアップロードします。Snowflakeは、アップロードされたコードをインストールする前に、そのコードのセキュリティ問題をスキャンします。
次の例は、既存のコラボレーションにテンプレートを追加するリクエストを示しています。
コードバンドルの新しいバージョンの送信¶
すべての登録済みコード仕様は、アカウント内のすべてのレジストリにおいて一意の「名前+バージョン」を持つ必要があります。テンプレートは、コード仕様の特定の名前とバージョンをロードします。コードの新しいバージョンを作成または使用する場合は、code_specsフィールドで新しいコードバージョンを参照するテンプレートの新しいバージョンを送信する必要があります。テンプレート本文を変更する必要はありません。例:
**ステップ1:**コードバンドルのバージョン1を使用します。
**ステップ2:**コードバンドルの新しいバージョンを更新および登録し、新しいバージョンを使用するようにテンプレートを更新します。
関数名にはバージョンが含まれないため、関数の新しいバージョンをアップロードするときにテンプレート本文の呼び出しコードを変更する必要はありません。
コードバンドル仕様¶
この仕様は、テンプレートから呼び出すことができる1つ以上のコード関数またはプロシージャのバンドルを定義します。
コードバンドル仕様には、関数とプロシージャを合わせて最大5つまで含めることができます。
コードバンドル仕様の識別子には、以下の一般的な要件があります。
名前:文字で始まり、英数字とアンダースコアのみを含む、有効な:doc:`Snowflake識別子</sql-reference/identifiers-syntax>`である必要があります。
引用符で囲まれた識別子:特殊文字を含む名前では、二重引用符で囲まれた識別子がサポートされています。
大文字と小文字の区別:引用符で囲まれていない識別子は大文字と小文字を区別しません。引用符で囲まれた識別子は大文字と小文字を保持します。
api_version使用するコラボレーション API のバージョン。
2.0.0である必要があります。spec_type仕様タイプ識別子。
code_specである必要があります。name: identifierこのレジストリ内における、このコードバンドル仕様の一意の名前。最大75文字の有効な:doc:
Snowflake識別子</sql-reference/identifiers-syntax>`である必要があります。これは、テンプレートで関数を呼び出すときの最後の名前セグメントとして使用されます。:samp:`cleanroom.{code_spec_name}${function_name}version: version_idカスタムバージョン識別子。アンダースコアを含む英数字で、最大20文字である必要があります。
- :samp:`description: {description_text}`(オプション)
コードバンドル仕様の説明(最大1,000文字)。
- ``artifacts``(オプション)
関数またはプロシージャからインポートでき、オプションでハンドラー関数を介して公開できる、ステージングされたファイルまたはパッケージのリスト。仕様ごとに最大5つ。
alias: identifierインポートでこのアーティファクトを参照するためのエイリアス。この仕様内でこのエイリアスを参照する場合は、:samp:`cleanroom.{spec_name}${alias}`ではなく修飾子のないエイリアス名を使用します。つまり、この仕様内の別の関数を参照するには、修飾子のない関数名を使用します。
stage_path: stage_pathアーティファクトファイルへの完全なステージパス(例:
@DB.SCHEMA.STAGE/path/file.whl)。
**ステージではDIRECTORYが有効になっている必要があります。**アーティファクトを含むステージには``DIRECTORY = TRUE``を設定する必要があります。
ステージパス形式::samp:`@[{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の1つ、または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パッケージ<https://repo.anaconda.com/pkgs/snowflake/>`_または:ref:`これらの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テーブルにコードが保存されます。コード仕様が登録されると、テンプレートで使用できるようになります。
登録されたすべてのコード仕様は、アカウント内のすべてのレジストリにおいて一意の「名前+バージョン」を持つ必要があります。
構文¶
引数¶
registry_name(オプション)このコード仕様を登録する:doc:`カスタムレジストリ</user-guide/cleanrooms/v2/registries>`の名前。指定しない場合、コードバンドルはデフォルトのアカウントレジストリに登録されます。
code_spec文字列としての、YAML形式のコードバンドル仕様定義。
戻り値¶
生成されたコードバンドル仕様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
ローカルアカウントレジストリでこのロールによって登録されているすべてのコードバンドル仕様を一覧表示します。
構文¶
引数¶
registry_name(オプション)コード仕様を一覧表示する元の:doc:`カスタムレジストリ</user-guide/cleanrooms/v2/registries>`の名前。指定しない場合、デフォルトのアカウントレジストリからコード仕様を一覧表示します。
戻り値¶
このアカウントで登録したすべてのコードバンドルの詳細を一覧表示するテーブル。テーブルには、次の列が含まれています。
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を定義します。
Wheelパッケージを使用したステージングされたアーティファクト¶
コード仕様内のステージングされたコードにリンクするための、:ref:`stage_pathドキュメント要件<label-dcr_collab_code_bundle_spec_yaml>`を必ずお読みください。
この例のYAMLは、ステージングされたPython Wheelパッケージを使用します。
ストアドプロシージャ¶
この例の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- 原因:
テンプレートが未登録のコードバンドル仕様を参照しています。
- 解決策:
テンプレートを登録する前に、コードバンドル仕様を登録してください。