コラボレーションクリーンルームでのカスタム関数のアップロードと使用

概要

コラボレーターは、カスタムPythonのUDFsおよびUDTFsをコラボレーションにアップロードできます。コラボレーションのテンプレートは、これらの関数を実行して複雑なデータアクションを実行できます。一般的な使用法には、クエリ内の機械学習やカスタマイズされたデータ操作が含まれます。アップロードしたコードは、`承認済みのPythonパッケージバンドル<https://repo.anaconda.com/pkgs/snowflake/>`_および:ref:`SnowparkAPIパッケージ<label-dcr_snowpark_udf>`からパッケージをインポートして使用できます。

注釈

Pythonは、カスタム UDFs でサポートされている唯一のコーディング言語です。

次のセクションでは、カスタム関数をアップロードして使用する方法を説明します。

カスタムコードバンドルの定義と使用

カスタム関数をアップロードして使用する方法は次のとおりです。

コード送信者

  1. REGISTER_CODE_SPEC

    コードは仕様内にインラインで記述するか、ステージからリンクできます

  2. テンプレートの``code_specs``配列内でIDによって:ref:コードバンドル仕様を参照するテンプレートを作成します<label-dcr_collaboration_create_and_register_code_bundle_template>。この例に示すように、このフィールドをテンプレートおよびパラメーターフィールドと同列に追加します。

     parameters:
       - name: <parameter_name>
         description: <parameter_description>
         required: <true_or_false>
         default: <default_value>
         type: <data_type>
    
     code_specs:             # Optional: List of code bundles used by this template
     - <code_spec_id>        # One or more code spec IDs.
    
     template: |
       <template_content>
    
  3. テンプレートを登録してから、テンプレートをコラボレーションにリンクします

    注釈

    Snowflakeは、アップロードされたコードのセキュリティ問題をスキャンします。セキュリティの問題が見つかった場合、コードとそれを含むテンプレートはコラボレーションに追加されません。

分析実行者:

  • ``RUN``を呼び出して、標準的な方法でテンプレートを実行します。

重要

Snowflakeは、アップロードされたバンドルをクリーンルームにデプロイする前にセキュリティチェックを実行します。セキュリティチェックが失敗した場合、テンプレートとそのバンドルコードはデプロイされず、使用できません。

コードバンドルを含むテンプレートがデプロイされ、使用可能であることを確認するには、以下のステップを実行します。

  1. コードバンドルをデプロイしようとしているクリーンルームアプリケーションの名前を見つけます。

    SHOW APPLICATIONS LIKE 'SFDCR_<collaboration name>';
    
  2. DESCRIBE APPLICATIONの応答で``upgrade_state``の値を確認します。アップグレード状態がCOMPLETEの場合、セキュリティチェックに合格しており、新しいテンプレートとバンドルを使用できます。次の例のSQLコードのように、SQLを使用して前のステップのコマンドによって返されたアプリケーション名を渡します。

    DESCRIBE APPLICATION <application name>
    

コードバンドル仕様の作成と登録

カスタムコードをアップロードする最初のステップは、コードバンドル仕様を作成して登録することです。

カスタム関数は、YAMLコードバンドル仕様で定義されます。各コードバンドルは、テンプレートから呼び出すことができる1つ以上の関数を公開します。コードバンドル仕様には、仕様内にコードをインラインで含めるか、:ref:`Snowflakeステージ上にあるコードにリンクする<label-dcr_collab_code_bundles_staged_artifacts>`ことができます。

コラボレーターは、``REGISTRY.REGISTER_CODE_SPEC``を呼び出して仕様を登録します。これにより、バンドルIDが返されます。どのようなロールを持つコラボレーターでも、コードバンドルを登録してリンクできます。

コードバンドルがコラボレーションにリンクされると、そのコードバンドルは、コードバンドルをリンクするテンプレートにアクセスできるコラボレーション内のすべてのユーザーに表示されます。``VIEW_CODE_SPECS``を呼び出して、コラボレーション内でアクセス可能なコードバンドルを一覧表示します。

コラボレーションでコードバンドルを表示できるユーザーは誰でも、そのコラボレーション内の自分のテンプレートでそれを表示して使用できます。インラインコードはコラボレーションのメンバーであれば誰でも表示できますが、ステージングされたアーティファクトコードはコラボレーターには表示されません。

その仕様で定義されている``normalize``関数を呼び出す、``normalize_value``という名前の単一のPythonUDFを公開するコードバンドル仕様は次のとおりです。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_CODE_SPEC(
  $$
  api_version: 2.0.0
  spec_type: code_spec
  name: custom_udf
  version: v1
  functions:
    - name: normalize_value
      type: UDF
      language: PYTHON
      handler: normalize
      arguments:
        - name: value
          type: FLOAT
      returns: FLOAT
      code_body: |
        def normalize(value):
            return value / 100.0
  $$
);

呼び出しテンプレートの作成と登録

コード仕様が登録された後、コラボレーターはこのコードバンドルを使用するテンプレートを登録します。コードバンドルを使用するには、テンプレートの``code_specs``フィールドにバンドル仕様IDを追加します。

テンプレートは、構文:samp:cleanroom.{spec_name}${function_name}`を使用してカスタム関数を呼び出します。リテラルの`.``および``$``の名前スコープマークに注意してください。

注釈

テンプレート内の関数を参照するには、仕様IDではなく仕様名を使用します。

以下の例では、テンプレートはコードバンドル``custom_udf``の関数``normalize_value``を使用します。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE(
  $$
  api_version: 2.0.0
  spec_type: template
  name: normalization_template
  version: v1
  type: sql_analysis
  code_specs:
    - custom_udf_v1  -- Imports the code bundle.
  template: |
    SELECT cleanroom.custom_udf$normalize_value(metric, 0, 100)  -- Calls the UDF.
      AS normalized
        FROM {{ source_tables[0] }}
  $$
);

コラボレーションへのテンプレートの追加

標準的な方法で、関数を呼び出すテンプレートをコラボレーションに追加します。詳細については、 テンプレート をご参照ください。

呼び出しテンプレートがコラボレーションに追加されると、Snowflakeは検証を行い、コラボレーションにアップロードします。Snowflakeは、アップロードされたコードをインストールする前に、そのコードのセキュリティ問題をスキャンします。

次の例は、既存のコラボレーションにテンプレートを追加するリクエストを示しています。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.ADD_TEMPLATE_REQUEST(
  'my_collaboration',
  'normalization_template_v1',
  ['consumer']
);

コードバンドルの新しいバージョンの送信

すべての登録済みコード仕様は、アカウント内のすべてのレジストリにおいて一意の「名前+バージョン」を持つ必要があります。テンプレートは、コード仕様の特定の名前とバージョンをロードします。コードの新しいバージョンを作成または使用する場合は、code_specsフィールドで新しいコードバージョンを参照するテンプレートの新しいバージョンを送信する必要があります。テンプレート本文を変更する必要はありません。例:

**ステップ1:**コードバンドルのバージョン1を使用します。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE(
  $$
  api_version: 2.0.0
  spec_type: template
  name: normalization_template
  version: v1
  type: sql_analysis
  code_specs:
    - custom_udf_v1  -- Bundle ID includes the version number.
  template: |
    SELECT cleanroom.custom_udf$normalize_value(metric, 0, 100)  -- Calls the UDF.
      AS normalized
        FROM {{ source_tables[0] }}
  $$
);

**ステップ2:**コードバンドルの新しいバージョンを更新および登録し、新しいバージョンを使用するようにテンプレートを更新します。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE(
  $$
  api_version: 2.0.0
  spec_type: template
  name: normalization_template
  version: v2        -- Update the template version.
  type: sql_analysis
  code_specs:
    - custom_udf_v2  -- Use the new code bundle.
  template: |
    SELECT cleanroom.custom_udf$normalize_value(metric, 0, 100)  -- No change needed here.
      AS normalized
        FROM {{ source_tables[0] }}
  $$
);

関数名にはバージョンが含まれないため、関数の新しいバージョンをアップロードするときにテンプレート本文の呼び出しコードを変更する必要はありません。

コードバンドル仕様

この仕様は、テンプレートから呼び出すことができる1つ以上のコード関数またはプロシージャのバンドルを定義します。

コードバンドル仕様には、関数とプロシージャを合わせて最大5つまで含めることができます。

コードバンドル仕様の識別子には、以下の一般的な要件があります。

  • 名前:文字で始まり、英数字とアンダースコアのみを含む、有効な:doc:`Snowflake識別子</sql-reference/identifiers-syntax>`である必要があります。

  • 引用符で囲まれた識別子:特殊文字を含む名前では、二重引用符で囲まれた識別子がサポートされています。

  • 大文字と小文字の区別:引用符で囲まれていない識別子は大文字と小文字を区別しません。引用符で囲まれた識別子は大文字と小文字を保持します。

api_version: 2.0.0              # Required: Must be "2.0.0"
spec_type: code_spec            # Required: Must be "code_spec"
name: <identifier>              # Required: Unique name of this code bundle.
version: <version_id>           # Required: Alphanumeric with underscores (max 20 chars)
description: <description_text> # Optional: Description (max 1,000 chars)

artifacts:                      # Optional: Staged files for import
  - alias: <identifier>         # One or more artifact items...
    stage_path: <stage_path>    # Required: Full stage path. See below for additional requirements.
    description: <description_text>  # Optional: Description (max 500 chars)
    content_hash: <sha256_hash>      # Optional: SHA-256 hash for integrity verification

functions:                      # Required if no procedures defined
  - name: <identifier>          # One or more functions...
    type: UDF | UDTF            # Required: Function type
    language: PYTHON            # Required: Currently only PYTHON supported
    runtime_version: <python_version>  # Optional: Python runtime (3.10 - 3.14)
    handler: <handler>          # Required: Handler function
    arguments:                  # Optional: One or more function arguments
      - name: <arg_name>        # Argument name
        type: <sql_type>        # Snowflake SQL type of this argument
    returns: <sql_type>         # Required: Snowflake return type
    packages:                   # Optional: Package dependencies
      - <package_name>          # One or more package items...
    imports:                    # Optional: Artifact aliases to import
      - <artifact_alias>        # One or more import items...
    code_body: |                # Optional: Inline Python code (max 12 MB)
      <inline_python_code>
    description: <description_text>  # Optional: Description of this function.

procedures:                     # Required if no functions defined
  - name: <identifier>          # One or more procedure items...
    language: PYTHON            # Required: Currently only PYTHON supported
    runtime_version: <python_version>  # Optional: Python runtime version
    handler: <handler>          # Required: Handler function
    arguments:                  # Optional: One or more procedure arguments
      - name: <arg_name>        # Argument name
        type: <sql_type>        # Snowflake SQL type of this argument
    returns: <sql_type>         # Optional: Return type
    packages:                   # Optional: Package dependencies
      - <package_name>          # One or more package items...
    imports:                    # Optional: Artifact aliases to import
      - <artifact_alias>        # One or more import items...
    code_body: |                # Optional: Inline Python code
      # inline python_code ...
    description: <description_text>  # Optional: Description of this procedure.
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`を呼び出す必要があります。コードの更新は、コード仕様を登録する前にのみサポートされます。このときにバージョンが割り当てられ、ハッシュチェックサムが計算されるためです。

:samp:`description: {description_text}`(オプション

アーティファクトの説明(最大500文字)。

:samp:`content_hash: {sha256_hash}`(オプション

整合性検証用のSHA-256ハッシュ(64文字の16進数)。

``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テーブルにコードが保存されます。コード仕様が登録されると、テンプレートで使用できるようになります。

登録されたすべてのコード仕様は、アカウント内のすべてのレジストリにおいて一意の「名前+バージョン」を持つ必要があります。

構文

REGISTER_CODE_SPEC( ['<registry_name>' ,] <code_spec> )

引数

registry_name (オプション)

このコード仕様を登録する:doc:`カスタムレジストリ</user-guide/cleanrooms/v2/registries>`の名前。指定しない場合、コードバンドルはデフォルトのアカウントレジストリに登録されます。

code_spec

文字列としての、YAML形式のコードバンドル仕様定義。

戻り値

生成されたコードバンドル仕様ID。

デフォルトレジストリへのコードバンドルの登録:

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_CODE_SPEC(
  $$
  api_version: 2.0.0
  spec_type: code_spec
  name: custom_udf
  version: v1
  description: Custom UDF for data normalization

  functions:
    - name: normalize_value
      type: UDF
      language: PYTHON
      runtime_version: "3.10"
      handler: normalize
      arguments:
        - name: value
          type: FLOAT
        - name: min_val
          type: FLOAT
        - name: max_val
          type: FLOAT
      returns: FLOAT
      code_body: |
        def normalize(value, min_val, max_val):
            if max_val == min_val:
                return 0.0
            return (value - min_val) / (max_val - min_val)
  $$
);

カスタムレジストリへのコードバンドルの登録:

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_CODE_SPEC(
  'my_custom_registry',
  $$
  api_version: 2.0.0
  spec_type: code_spec
  name: custom_udf
  version: v1
  description: Custom UDF for data normalization

  functions:
    - name: normalize_value
      type: UDF
      language: PYTHON
      runtime_version: "3.10"
      handler: normalize
      arguments:
        - name: value
          type: FLOAT
        - name: min_val
          type: FLOAT
        - name: max_val
          type: FLOAT
      returns: FLOAT
      code_body: |
        def normalize(value, min_val, max_val):
            if max_val == min_val:
                return 0.0
            return (value - min_val) / (max_val - min_val)
  $$
);

アクセス要件

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

ローカルアカウントレジストリでこのロールによって登録されているすべてのコードバンドル仕様を一覧表示します。

構文

VIEW_REGISTERED_CODE_SPECS( [ '<registry_name>' ] )

引数

registry_name (オプション)

コード仕様を一覧表示する元の:doc:`カスタムレジストリ</user-guide/cleanrooms/v2/registries>`の名前。指定しない場合、デフォルトのアカウントレジストリからコード仕様を一覧表示します。

戻り値

このアカウントで登録したすべてのコードバンドルの詳細を一覧表示するテーブル。テーブルには、次の列が含まれています。

  • CODE_SPEC_ID:コードバンドル仕様のID。

  • NAME:コードバンドルの仕様名。

  • VERSION:コードバンドル仕様のバージョン。

  • CODE_SPEC:コードバンドル仕様の完全なYAML仕様。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.VIEW_REGISTERED_CODE_SPECS();

アクセス要件

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

指定されたコラボレーション内でユーザーが作成した、またはユーザーが実行できるテンプレートによって参照されるすべてのコードバンドル仕様を返します。

構文

VIEW_CODE_SPECS( <collaboration_name> )

引数

collaboration_name

コラボレーションのID。

戻り値

指定されたコラボレーションで利用可能なコードバンドルを一覧表示するテーブル。テーブルには、次の列が含まれています。

  • CODE_SPEC_ID:このコードバンドル仕様のID。

  • CODE_SPEC:コードバンドル仕様の完全なYAML仕様。

  • SHARED_BY:コードバンドル仕様を共有したコラボレーターのエイリアス。

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_CODE_SPECS(
  $collaboration_id
);

アクセス要件

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

api_version: 2.0.0
spec_type: code_spec
name: string_utils
version: v1
description: String utility functions

functions:
  - name: clean_string
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: clean
    arguments:
      - name: input_str
        type: STRING
    returns: STRING
    description: Removes leading/trailing whitespace and converts to lowercase
    code_body: |
      def clean(input_str):
          if input_str is None:
              return None
          return input_str.strip().lower()

  - name: extract_domain
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: extract
    arguments:
      - name: email
        type: STRING
    returns: STRING
    description: Extracts domain from email address
    code_body: |
      def extract(email):
          if email is None or '@' not in email:
              return None
          return email.split('@')[1]

UDTF(ユーザー定義テーブル関数)

この例のYAMLは、複数行を返すUDTFを定義します。

api_version: 2.0.0
spec_type: code_spec
name: tokenizer
version: v1
description: Text tokenization UDTF

functions:
  - name: tokenize_text
    type: UDTF
    language: PYTHON
    runtime_version: "3.10"
    handler: Tokenizer
    arguments:
      - name: text
        type: STRING
      - name: delimiter
        type: STRING
    returns: TABLE(token STRING, position INTEGER)
    description: Splits text into tokens and returns each with its position
    code_body: |
      class Tokenizer:
          def process(self, text, delimiter):
              if text is None:
                  return
              tokens = text.split(delimiter if delimiter else ' ')
              for i, token in enumerate(tokens):
                  yield (token.strip(), i)

Wheelパッケージを使用したステージングされたアーティファクト

コード仕様内のステージングされたコードにリンクするための、:ref:`stage_pathドキュメント要件<label-dcr_collab_code_bundle_spec_yaml>`を必ずお読みください。

この例のYAMLは、ステージングされたPython Wheelパッケージを使用します。

api_version: 2.0.0
spec_type: code_spec
name: ml_scoring
version: v2
description: ML scoring functions using custom library

artifacts:
  - alias: ml_lib
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/libs/ml_scoring_lib-1.0.0-py3-none-any.whl"
    description: Custom ML scoring library
    content_hash: "a1b2c3d4e5f6..."

functions:
  - name: predict_score
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: ml_scoring_lib.predictor.predict
    arguments:
      - name: features
        type: ARRAY
    returns: FLOAT
    packages:
      - numpy
      - scikit-learn
    imports:
      - ml_lib
    description: Predicts score using trained ML model

ストアドプロシージャ

この例のYAMLは、データ処理用のストアドプロシージャを定義します。

api_version: 2.0.0
spec_type: code_spec
name: data_processor
version: v1
description: Data processing procedures

procedures:
  - name: aggregate_metrics
    language: PYTHON
    runtime_version: "3.10"
    handler: process
    arguments:
      - name: table_name
        type: STRING
      - name: group_column
        type: STRING
    returns: STRING
    packages:
      - snowflake-snowpark-python
    description: Aggregates metrics by specified column
    code_body: |
      def process(session, table_name, group_column):
          df = session.table(table_name)
          result = df.group_by(group_column).count()
          result.write.mode("overwrite").save_as_table("aggregated_results")
          return f"Aggregated {df.count()} rows into aggregated_results"

ステージングされたアーティファクトとしての複数のPythonファイル

コード仕様内のステージングされたコードにリンクするための、:ref:`stage_pathドキュメント要件<label-dcr_collab_code_bundle_spec_yaml>`を必ずお読みください。

この例のYAMLは、ステージングされた複数のPythonソースファイルを使用します。

api_version: 2.0.0
spec_type: code_spec
name: analytics_suite
version: v3
description: Analytics suite with multiple modules

artifacts:
  - alias: utils
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/analytics/utils.py"
    description: Utility functions
  - alias: transformers
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/analytics/transformers.py"
    description: Data transformation functions
  - alias: validators
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/analytics/validators.py"
    description: Validation functions

functions:
  - name: transform_and_validate
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: transformers.transform_validate
    arguments:
      - name: data
        type: OBJECT
    returns: OBJECT
    imports:
      - utils
      - transformers
      - validators
    description: Transforms and validates input data

コードバンドルのトラブルシューティング

エラー:

CodeSpecAlreadyExistsException

原因:

同じ名前とバージョンのコードバンドル仕様が既に登録されています。

解決策:

別のバージョンを使用するか、既存のバージョンを更新します。


 

エラー:

SpecValidationError

原因:

YAMLはスキーマに準拠していません。

解決策:

必須フィールドと形式を確認してください。


 

エラー:

CodeSpecStageNotAccessibleError

原因:

アーティファクトで参照されているステージにアクセスできません。

解決策:

ステージへのアクセス権を付与するか、ステージが存在することを確認してください。


 

エラー:

CodeSpecArtifactNotFoundAtStageError

原因:

指定したステージパスでファイルが見つかりません。

解決策:

登録する前に、ファイルをステージにアップロードしてください。


 

エラー:

StageDirectoryNotEnabledError

原因:

ステージでDIRECTORYが有効になっていません。

解決策:

ステージでディレクトリを有効にしてください。ALTER STAGE ... SET DIRECTORY = (ENABLE = TRUE)


 

エラー:

CodeSpecNotFoundForOwnerException

原因:

テンプレートが未登録のコードバンドル仕様を参照しています。

解決策:

テンプレートを登録する前に、コードバンドル仕様を登録してください。