SQL で作成したストアドプロシージャの Scala ハンドラーを記述します。¶
ハンドラーが Scala で書かれたストアドプロシージャを作成できます。ストアドプロシージャ内でSnowparkライブラリを使用して、Snowflakeのテーブルに対してクエリ、更新、およびその他の作業を実行できます。
ストアドプロシージャを使用すると、Snowflakeウェアハウスをコンピュートフレームワークとして使用して、Snowflake内でデータパイプラインを構築して実行できます。データパイプラインのコードでは、ScalaのSnowpark API を使用してストアドプロシージャを記述します。これらのストアドプロシージャの実行をスケジュールするには、 タスク を使用します。
ハンドラーコードの実行時にログをキャプチャし、データをトレースできます。詳細については、 ロギング、トレース、メトリクス をご参照ください。
ストアドプロシージャの Scala ハンドラーを書く¶
- お使いの環境が 前提条件 を満たしていることを確認してください。 
- ローカルで開発している場合は、 Snowparkを使用するように環境をセットアップしてください。 
- ハンドラー インラインに配置するか、ステージ に配置するかを選択します。 
- ハンドラー クラスまたはオブジェクト、 メソッドまたは関数、 パフォーマンス のガイドラインに従ってください。 
- データアクセス、 データファイル読み取り、 テーブル形式データを返す、 ログとトレース などの機能のサポートを実装します。 
- コードの 依存関係を Snowflake で利用可能にします。 
- ストアドプロシージャを作成する 際に、ハンドラーコードをインラインで含めるか、ステージからインポートしてください。 
注釈
匿名プロシージャの作成と呼び出しの両方を実行するには、 CALL (匿名プロシージャでの場合) を使用します。匿名プロシージャの作成と呼び出しには、 CREATE PROCEDURE スキーマ権限を持つロールは必要ありません。
前提条件を満たす¶
Snowflakeは現在、次のScalaのバージョンで記述プロシージャをサポートしています。
- 2.12 
バージョン1.1.0または最新バージョンのSnowparkライブラリを使用する必要があります。
ハンドラーコードがステージにコピーされるストアドプロシージャを記述している場合は、クラスをコンパイルしてJavaバージョン11.xで実行する必要があります。
Snowparkの開発環境のセットアップ¶
ローカルでコードを開発している場合は、Snowparkライブラリを使用するように開発環境をセットアップしてください。Snowpark Scalaの開発環境の設定 をご参照ください。
構造とハンドラーコード¶
プロシージャを作成する SQL とインラインでハンドラーソースコードを保持するか、別の場所にハンドラーのコンパイル結果を保持して SQL から参照することができます。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
プロシージャで使用するハンドラーソースコードのビルドの詳細については、 ハンドラーコードのパッケージ化 をご参照ください。
ハンドラークラスまたはオブジェクトのガイドライン¶
ハンドラー・クラスやオブジェクトを書く際には、以下の点に注意してください。
- クラス(またはオブジェクト)とメソッドは、保護またはプライベートにしないでください。 
- メソッドが静的ではなく、コンストラクターを定義する場合は、クラスの引数がゼロのコンストラクターを定義します。Snowflakeは、初期化時にこの引数がゼロのコンストラクターを呼び出して、クラスのインスタンスを作成します。 
- 同じクラスまたはオブジェクト内の異なるストアドプロシージャに対して異なるメソッドを定義できます。 
ハンドラーメソッドまたは関数のガイドライン¶
ストアドプロシージャのメソッドや関数を書く際には、以下の点に注意してください。
- メソッドまたは関数の最初の引数としてSnowpark - Sessionオブジェクトを指定します。- ストアドプロシージャを呼び出すと、Snowflakeは自動的に - Sessionオブジェクトを作成し、ストアドプロシージャに渡します。(- Sessionオブジェクトを自分で作成することはできません。)
- 残りの引数と戻り値には、 Snowflakeデータ型 に対応する Scala型 を使用します。 
- メソッドまたは関数は値を返す必要があります。 
- コードのアクティビティによってタイマーがリセットされない限り、ストアドプロシージャの実行はタイムアウトします。特に、タイムアウトタイマーは、ファイル操作、クエリ、結果セットの反復など、コードとデータの相互作用によってリセットされます。 
- プロシージャのハンドラー内から 非同期子ジョブ を実行する場合、"fire and forget"(ファイアアンドフォーゲット)はサポートされていません。 - 言い換えると、親プロシージャのジョブが完了したときに、ハンドラーがまだ実行中の子クエリを実行した場合、子ジョブは自動的にキャンセルされます。 
ハンドラーのパフォーマンスとセキュリティに関するガイドライン¶
Snowflake上でコードを確実に実行するには、以下のガイドラインに従ってください。
- 消費されるメモリの量を制限する - Snowflakeは、必要なメモリ量に関してメソッドに制限を設けています。過度の消費を回避する方法の詳細については、 Snowflakeが課す制約内でのハンドラーの設計 をご参照ください。 
- スレッドセーフなコードを記述する。 - ハンドラーメソッドまたは関数がスレッドセーフであることを確認してください。 
- セキュリティ制限を理解する。 - ハンドラーコードは制限されたエンジン内で実行されるため、 UDFs とプロシージャのセキュリティプラクティス で説明されているルールに従ってください。 
- 所有者の権限または呼び出し元の権限の使用を決定する。 - ストアドプロシージャの記述を計画するときは、ストアドプロシージャを 呼び出し元の権限または所有者の権限 で実行するかどうかを検討します。 
- ストアドプロシージャのタイムアウト動作に注意してください。 - コードのアクティビティによってタイマーがリセットされない限り、ストアドプロシージャの実行はタイムアウトします。特に、タイムアウトタイマーは、ファイル操作、クエリ、結果セットの反復など、コードとデータの相互作用によってリセットされます。 
コードで依存関係を利用できるようにする¶
ハンドラーコードがハンドラー自体の外部で定義されたコード(JAR ファイル内のクラスなど)またはリソースファイルに依存している場合は、それらの依存関係をステージにアップロードすると、それらの依存関係をコードで使用できるようにすることができます。プロシージャを作成する ときに、 IMPORTS 句を使用してこれらの依存関係を参照できます。
詳細については、 コードで依存関係を利用できるようにする方法 をご参照ください。