設定された Snowflake Native App アーティファクトを含むローカルフォルダーの準備¶
設定された成果物を含むローカル・フォルダーを作成する。¶
snow app bundle
コマンドは、プロジェクトにローカルディレクトリを作成し、プロジェクト定義ファイルで指定したファイル構造をそのディレクトリに入れ、デコレーター( @sproc
や @udaf
など)を含む Snowpark Python コードから、Snowflake Native App セットアップスクリプトに CREATE FUNCTION または CREATE PROCEDURE の宣言を生成します。詳細については、 snowflake.snowpark.functions.udaf など、選択した関数デコレーターに対応する Snowpark Python ドキュメントをご参照ください。
snow app deploy
と:codenowrap:snow app run
コマンドは、すでにこの機能を使用しています。しかし、明示的な:codenowrap:snow app bundle
コマンドを自由に使えるようになったので、ステージにアップロードされる前にこのディレクトリを探索し、アーティファクトが期待通りに作成されたかを確認することができます。
設定された成果物を含むローカル・フォルダを作成するには、以下のようにします。
次のようなSnowflake
snowflake.yml
プロジェクト定義ファイルを作成または検証します。definition_version: 2 entities: codegen_nativeapp_pkg: type: application package manifest: root_files/_manifest.yml artifacts: - src: root_files/README.md dest: README.md - src: root_files/_manifest.yml dest: manifest.yml - src: root_files/setup_scripts/* dest: setup_scripts/ - src: python/user_gen/echo.py dest: user_gen/echo.py - src: python/cli_gen/* dest: cli_gen/ processors: - snowpark codegen_nativeapp_pkg: type: application from: target: codegen_nativeapp_pkg
プロジェクト・ディレクトリから
snow app bundle
コマンドを実行し、設定した成果物を含む仮output/deploy
ディレクトリを作成します。snow app bundle
出力またはデプロイディレクトリの内容が、snowflake.yml.ファイルで指定したルールと一致していることを確認します。PythonファイルでSnowparkアノテーション処理を呼び出した場合、ディレクトリ内の修正されたセットアップスクリプトで生成されたコードを見ることができます。
詳細については、 snow app bundle コマンドをご参照ください。
Snowparkアノテーション処理を使用して SQL コードを生成します。¶
限定的な SQL の経歴を持つ Snowflake Native App 開発者であれば、時間の経過とともに非常に大きく複雑になる可能性がある セットアップスクリプト を書いたり保守したりするのは面倒だと感じるかもしれません。セットアップスクリプトには、カスタマーがデータで使用できるすべてのアプリケーションロジックが含まれているため、Snowflake Native Appの開発には必須です。セットアップスクリプトのコアコンポーネントの1つは、関数やストアドプロシージャにSnowpark Python拡張関数を使用できることです。Python、Java、またはその他のSnowparkがサポートする言語でSnowparkコードを記述することに加えて、セットアップスクリプトで SQL 、これらの関数やプロシージャの対応する部分を記述する必要があります。
例えば、Snowpark Pythonを使って、次のように基本的な関数とストアドプロシージャを作成することができます。
# Example python file "echo.py" that a developer writes
def echo_fn(data):
return 'echo_fn: ' + data
def echo_proc(session, data):
return 'echo_proc: ' + data
そのファイルをステージにアップロードし、セットアップスクリプト SQL 、次のようなコードで参照する必要があります。
-- Sample setup_script.sql SQL file for a Snowflake Native App
CREATE APPLICATION ROLE IF NOT EXISTS app_instance_role;
CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;
CREATE OR REPLACE PROCEDURE ext_code_schema.py_echo_proc(DATA string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_proc'
IMPORTS=('/echo.py');
GRANT USAGE ON PROCEDURE ext_code_schema.py_echo_proc(string)
TO APPLICATION ROLE app_instance_role;
-- Wraps a function from a python file
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');
GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(DATA string)
TO APPLICATION ROLE app_instance_role;
SQL コード自動生成¶
注釈
SQL コードの自動生成を利用するには、Snowpark Python バージョン 1.15.0以上を使用する必要があります。
この余分な作業を軽減するために、 Snowflake CLI はセットアップスクリプトに必要な SQL を自動生成することができます。Snowpark Python は拡張関数デコレーター (@udf
、 @sproc
、 @udtf
、 @udaf
) と呼ばれる機能をサポートしており、 snowflake.snowpark.functions.udf 関数デコレーターを使用するなど、Python コードに注釈を付けることができます。 Snowflake CLI はこれらのデコレーターを使用して、セットアップスクリプトに必要な SQL コードを自動的に作成し、検証することができます。
例えば、先の例の関数には @udf
デコレーターを使うことができます。
# some python file echo.py
@udf(name="echo_fn")
def echo_fn(data) -> str:
return 'echo_fn: ' + str
@udf
デコレーターを使用すると、 Snowflake CLI snow app bundle (および:codenowrap:snow app bundle
コマンドを内部的に呼び出す他のコマンド)に、Snowpark Python デコレーターを処理し、対応する SQL コマンドを生成し、セットアップスクリプトに自動的に含めるように指示します。したがって、セットアップ・スクリプトのために記述する必要のある SQL コードの量を最小限に抑えることができます。
-- Sample setup_script.sql SQL file for a Snowflake Native App
-- User-written code
CREATE OR REPLACE APPLICATION ROLE app_instance_role;
CREATE OR ALTER VERSIONED SCHEMA ext_code_schema;
GRANT USAGE ON SCHEMA ext_code_schema TO APPLICATION ROLE app_instance_role;
-- Snowflake CLI generated code
CREATE OR REPLACE FUNCTION ext_code_schema.py_echo_fn(DATA string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_fn'
IMPORTS=('/echo.py');
GRANT USAGE ON FUNCTION ext_code_schema.py_echo_fn(string)
TO APPLICATION ROLE app_instance_role;
Snowpark Python の使用を開始します。¶
Snowflake CLI の Snowpark デコレーターは、通常の Snowpark Python デコレーターと同じように動作しますが、 Snowflake Native App 用の Python コードファイルを書く際には、以下の違いに注意する必要があります。
これらのファイルで:codenowrap:
Session
オブジェクトを使用することはできません。 Snowflake CLI は、Snowflake に接続しないサンドボックス環境でこれらの Python ファイルを実行するからです。その結果、Snowparkの:codenowrap:Session
を参照するとエラーになります。@udf
、@sproc
、@udaf
、@udtf
Snowpark Python デコレーターのみを使用できます。これらのデコレーターを通常の関数として使用して、コードをSnowflakeオブジェクトとして登録することはできません。サポートされているデコレーターで明示的にアノテーションされたコードのみが認識されます。したがって、Pythonの関数は名前付き関数でなければなりません。Lambda関数はサポートされていません。
Snowflake CLI はセットアップスクリプトでファンクションやプロシージャを作成するために、Snowflakeが推奨する ステートメントである CREATE OR REPLACE を常に生成します。
デコレーター・プロパティの詳細¶
次の表は Python デコレーターのプロパティの一覧で、 Snowflake CLI がそれらをどのように使うかを説明しています。
プロパティ |
詳細 |
---|---|
name オプション |
SQL ステートメントを生成するために Snowflake CLI が使用する関数またはストアドプロシージャの名前。 このプロパティを省略すると、 Snowflake CLI は、 SQL ステートメントを生成するために Python 関数名を再利用します。 |
input_types 必須 |
この関数またはストアドプロシージャの各入力パラメーターの型。 この情報は、このデコレーター・パラメーターで指定するか、コードで直接型アノテーションを指定する必要があります。この情報がどちらの場所にもない場合、 Snowflake CLI はこの関数またはストアドプロシージャに対して SQL ステートメントを生成しません。 |
return_type 必須 |
この関数またはストアドプロシージャの戻り値の型。 この情報は、このデコレーター・パラメーターで指定するか、コードで直接型アノテーションを指定する必要があります。この情報がどちらの場所にもない場合、 Snowflake CLI はこの関数またはストアドプロシージャに対して SQL ステートメントを生成しません。 |
パッケージ オプション |
パッケージのリスト。 このプロパティを省略すると、 Snowflake CLI 、自動的に:codenowrap: |
imports オプション |
Snowflake関数またはストアドプロシージャがステージからインポートする必要があるファイルのリスト。文字列または文字列のタプルとして指定できます。タプルを指定した場合、 Snowflake CLI 、0番目のインデックスの文字列のみが使用されます。タプルの使用例については、 外部Pythonファイルを使用する をご参照ください。 インポートを指定しない場合、 Snowflake CLI は自動的に、 SQL を生成する関数またはストアドプロシージャを含む Python ファイルのインポートを追加します。インポートのパスは、プロジェクト定義ファイルに基づいて、デプロイのルートディレクトリにあるPythonファイルの |
execute_as オプション |
ストアド・プロシージャの実行時に使用するペルソナ。値は、 |
handler N/A |
関数またはストアドプロシージャのハンドラー。 Snowflake CLI はこのフィールドに自動的に入力します。 |
置換 未使用 |
Snowflake CLI はコード生成に |
セッション 必須 |
|
is_permanent 未使用 |
Snowflake CLI はこのフィールドを SQL 作成のために使用しません。 |
stage_location 未使用 |
Snowflake CLI はこのフィールドを SQL 作成のために使用しません。 |
if_not_exists 未使用 |
Snowflake CLI はこのフィールドを SQL 作成のために使用しません。 |
厳しい 未使用 |
Snowflake CLI はこのフィールドを SQL 作成のために使用しません。 |
セキュア 未使用 |
Snowflake CLI はこのフィールドを SQL 作成のために使用しません。 |
不変 未使用 |
Snowflake CLI はこのフィールドを SQL 作成のために使用しません。 |
native_app_params オプション |
(Snowflake Native App のみ) 以下の Snowflake Native App パラメータを含む Python 辞書:
技術的にはオプションですが、プロジェクト定義ファイルで |
Python ファイルをデスティネーションステージにアップロードするとき、 Snowflake CLI はデコレーターをコメントに変換するので、これらの UDFs やストアドプロシージャは現在のセッションでは作成されません。元のソースファイルは変更されないので、snow app bundle
コマンドはべき等であり続けます。デプロイルートディレクトリのPythonファイルだけがコメントを含むように変更されます。snow app bundle
コマンドを実行するたびに、デプロイルートは再作成されるからです。次の例は、 Snowflake CLI がデコレーターをコメントする方法を示しています。
# output/deploy/dest_dir1/dest_dir2/echo.py
#: @sproc(
#: return_type=IntegerType(),
#: input_types=[IntegerType(), IntegerType()],
#: packages=["snowflake-snowpark-python==1.15.0"],
#: native_app_params={
#: "schema": "ext_code_schema",
#: "application_roles": ["app_instance_role"],
#: },
#: )
def add_sp(session_, x, y):
return x + y
また、プロジェクト定義ファイルに processors
プロパティを持つ Python ファイルのみが影響を受けます。