ユーザー定義関数の作成¶
Snowflake で利用可能ないくつかの方法のいずれかを使用して、 ユーザー定義関数 (UDF) を作成できます。これらの方法については、このトピックで説明します。
UDF の作成¶
- Python、Java、Scalaなど、サポートされている言語のいずれかを使用して、関数ロジックをハンドラーとして記述します。 
- ツールまたは API を選択し、作成したハンドラーで関数を作成します。 - それぞれの情報については、 UDFs 作成ツール をご覧ください。 - SQL - SQL を使用し、いくつかの言語のいずれかでロジックを記述します。 - Snowpark - Java、Python、または Scala 用の Snowpark API を使用します。 - コマンドライン - CLI コマンドを実行して関数を作成します。 - Python API - クライアント側のPythonコマンドを実行して関数を作成します。 - REST - RESTful API に関数の作成リクエストを行います。 
- 必要に応じて、いくつかのツールのいずれかを使用して 関数を実行します。 
UDFs 作成ツール¶
言語やスキルセットに応じて、Snowflakeで利用可能ないくつかの方法のいずれかを使用して、 UDF を作成できます。以下の表から、お客様のニーズに合ったツールをお選びください。
| 言語 | アプローチ | 
|---|---|
| SQL Snowsight などで SQL コマンドを実行。 | SQL CREATE FUNCTION コマンド を実行し、以下の言語のいずれかで書かれたハンドラーコードを持つ関数を作成します。 | 
| Snowparkを使用したJava、Python、またはScala サポートされている言語のいずれかでコードを記述し、ローカルでコードを実行してSnowflakeで演算子を実行します。 | Snowpark APIs を使用するクライアントコードを以下のいずれかの言語で実行します。 | 
| コマンドライン コマンドラインからコマンドを実行して、Snowflakeエンティティを作成および管理します。 | Snowflake CLI のコマンドを実行します。 | 
| Python クライアント上で、Snowflakeの管理操作を実行するコードを記述します。 | Snowflake Python API を使用するコードを実行します。 | 
| RESTful APIs (言語にとらわれない) RESTful エンドポイントにリクエストを行い、Snowflake エンティティを作成および管理します。 | Snowflake REST API を使用したプロシージャの作成をリクエストします。 | 
キー・プロパティ¶
次に、関数を作成するときに必要な、または通常使用される、プロパティの一部について説明します。
- 関数名:
- 関数名はハンドラー名と一致する必要はありません。名前の制約と規則の詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。 
- 引数:
- 要件の詳細については、 UDFs およびストアドプロシージャの引数の定義 を参照してください。 
- 戻り型:
- Snowflakeが SQL データ型をハンドラーデータ型にマップする方法については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。 
- ハンドラー名:
- 必要な場合は、関数が実行されたときに実行されるコードを含むクラスまたはメソッドの名前です。Java、Python、およびScalaで記述されたハンドラーに対してのみ、ハンドラー名を指定する必要があります。JavaScript および SQL ハンドラーの場合、インラインで指定されたすべてのコードがハンドラーとして実行されます。 
- 依存関係:
- Java、Python、Scalaで書かれたハンドラーの場合、関数を作成する際などにSnowparkライブラリを指定する必要がある場合もあります。 - ハンドラーで依存関係を利用できるようにする方法の詳細については、 コードで依存関係を利用できるようにする方法 をご参照ください。 
- ハンドラー言語ランタイム:
- ハンドラー言語がJava、Python、Scalaの場合、サポートされているランタイムバージョンを示すためにランタイムバージョンを指定します。デフォルトのバージョンを使用している場合、そのデフォルトは時間の経過とともに変更されることに留意してください。 
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
| 権限 | オブジェクト | 注意 | 
|---|---|---|
| CREATE FUNCTION | スキーマ | この権限は、スキーマ内のユーザー定義関数の作成のみを可能にします。 データ測定関数の作成を有効にする場合は、ロールに CREATE DATA METRIC FUNCTION 権限が必要です。 | 
| USAGE | 関数 | 新しく作成された関数の USAGE 権限をロールに付与すると、そのロールを持つユーザーは、Snowflakeの他の場所でその関数を呼び出すことができます(外部トークン化のマスキングポリシーの所有者ロールなど)。 | 
| USAGE | 外部アクセス統合 | 統合(ある場合)に必要。EXTERNAL_ACCESS_INTEGRATIONS パラメーターで指定。詳細については、 CREATE EXTERNAL ACCESS INTEGRATION をご参照ください。 | 
| READ | シークレット | シークレット(ある場合)に必要。SECRETS パラメーターで指定。詳細については、 認証情報を表すシークレットの作成 および 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。 | 
| USAGE | スキーマ | シークレットを含むスキーマ(ある場合)に必要。SECRETS パラメーターで指定。詳細については、 認証情報を表すシークレットの作成 および 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。 | 
スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する 任意の権限を付与されたロールは、そのロールがスキーマを解決できることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対するUSAGE*も*付与されている必要はありません。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
以下の使用上の注意は、ハンドラーを記述するためにサポートされている言語に関連するものです。以下のセクションのリファレンスでは、 SQL CREATE FUNCTION コマンドの句に言及していますが、これらの句は通常、関数を作成するために使用できる他のツールでは別の方法で表現されます。
すべての言語¶
- function_definitionにはサイズ制限があります。最大許容サイズは変更される可能性があります。
- function_definitionを囲む区切り文字は、一重引用符またはドル記号のペアのいずれかです。- 区切り文字として - $$を使用すると、一重引用符を含む関数の記述が簡単になります。- 関数の本文の区切り文字が一重引用符文字である場合、 - function_definition(文字列リテラルなど)内の一重引用符は一重引用符でエスケープする 必要があります。
- マスキングポリシー で UDF を使用する場合は、列、 UDF、およびマスキングポリシーのデータ型が一致していることを確認します。詳細については、 マスキングポリシー内のユーザー定義関数 をご参照ください。 
- UDF のハンドラーコードで CURRENT_DATABASE または CURRENT_SCHEMA 関数を指定すると、この関数は、セッションで使用中のデータベースまたはスキーマではなく、 UDF を含むデータベースまたはスキーマを返します。 
- メタデータについて: - 注意 - Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。 
- OR REPLACEと- IF NOT EXISTS句は互いに排他的です。両方を同じステートメントで使うことはできません。
- CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。 
Java¶
- Javaでは、プリミティブデータ型は NULL 値を許可しないため、そのような型の引数に NULL を渡すと、エラーが発生します。 
- HANDLER 句では、メソッド名で大文字と小文字が区別されます。 
- IMPORTS および TARGET_PATH 句の場合、 - パッケージ、クラス、およびファイル名では 大文字と小文字が区別されます。 
- ステージ名では 大文字と小文字が区別されません。 
 
- PACKAGES 句を使用して、Snowparkの依存関係など、Snowflakeシステム定義の依存関係のパッケージ名とバージョン番号を指定できます。その他の依存関係については、 IMPORTS 句を使用して依存関係 JAR ファイルを指定します。 
- Snowflakeは次を検証します。 - CREATE FUNCTION ステートメントの HANDLER で指定された JAR ファイルが存在し、指定されたクラスとメソッドが含まれていること。 
- UDF 宣言で指定された入力および出力タイプは、Javaメソッドの入力および出力タイプと互換性があること。 
 - 検証は、アクティブなSnowflakeウェアハウスに接続しているかどうかに応じて、作成時または実行時に実行できます。 - 作成時 --- CREATE FUNCTION ステートメント実行時にアクティブなSnowflakeウェアハウスに接続している場合、 UDF は作成時に検証されます。 
- 実行時 --- アクティブなSnowflakeウェアハウスに接続していない場合、 UDF は作成されますが、すぐには検証されず、Snowflakeは以下のメッセージを返します。 - Function <名前> created successfully, but could not be validated since there is no active warehouse。
 
JavaScript¶
- Snowflakeは、 UDF の作成時に JavaScript コードを検証しません。つまり、 UDF の作成は、コードが有効かどうかに関係なく成功します。コードが有効でない場合、Snowflakeはクエリ時に UDF を呼び出したときに、エラーを返します。 
Python¶
- HANDLER 句では、ハンドラー関数名で大文字と小文字が区別されます。 
- IMPORTS 句で、 - ファイル名は 大文字と小文字が区別されます。 
- ステージ名では 大文字と小文字が区別されません。 
 
- PACKAGES 句を使用して、Snowparkの依存関係など、依存関係のパッケージ名とバージョン番号を指定できます。その他の依存関係については、 IMPORTS 句を使用して依存関係ファイルを指定します。 
- Snowflakeは次を検証します。 - CREATE FUNCTION ステートメントの HANDLER で指定された関数またはクラスが存在します。 
- UDF宣言で指定された入力および出力タイプは、ハンドラーの入力および出力タイプと互換性があること。 
 
Scala¶
- HANDLER 句では、メソッド名で大文字と小文字が区別されます。 
- IMPORTS および TARGET_PATH 句の場合、 - パッケージ、クラス、およびファイル名では 大文字と小文字が区別されます。 
- ステージ名では 大文字と小文字が区別されません。 
 
- PACKAGES 句を使用して、Snowparkの依存関係など、Snowflakeシステム定義の依存関係のパッケージ名とバージョン番号を指定できます。その他の依存関係については、 IMPORTS 句を使用して依存関係 JAR ファイルを指定します。 
- Snowflakeは次を検証します。 - CREATE FUNCTION ステートメントの HANDLER で指定された JAR ファイルが存在し、指定されたクラスとメソッドが含まれていること。 
- UDF 宣言で指定された入力および出力タイプは、Scalaメソッドの入力および出力タイプと互換性があること。 
 - 検証は、アクティブなSnowflakeウェアハウスに接続しているかどうかに応じて、作成時または実行時に実行できます。 - 作成時 --- CREATE FUNCTION ステートメント実行時にアクティブなSnowflakeウェアハウスに接続している場合、 UDF は作成時に検証されます。 
- 実行時 --- アクティブなSnowflakeウェアハウスに接続していない場合、 UDF は作成されますが、すぐには検証されず、Snowflakeは以下のメッセージを返します。 - Function <名前> created successfully, but could not be validated since there is no active warehouse。
 
SQL¶
- 現在、 SQL UDFs には NOT NULL 句は適用されていません。 
SQL で UDF を作成する¶
SQL で、以下の手順を使用して UDF を作成できます。
 
次のステップで UDF を作成します。
- UDF が呼び出されたときに実行するハンドラーコードを記述します。 - サポートされているハンドラー言語のいずれかを使用できます。詳細については、 対応言語とツール をご参照ください。 
- ハンドラーコードを CREATE FUNCTION SQL ステートメントとインラインで保持するか、ステージで参照するかを選択します。 - それぞれに利点があります。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。 
- SQL で CREATE FUNCTION ステートメントを実行し、関数のプロパティを指定します。 - 次の例のコードは、インラインハンドラー - HandlerClass.handlerMethodを使用して- function_nameという名前の UDF を作成します。- create function function_name(x integer, y integer) returns integer language java handler='HandlerClass.handlerMethod' target_path='@~/HandlerCode.jar' as $$ class HandlerClass { public static int handlerMethod(int x, int y) { return x + y; } } $$; - 次に、関数を作成するときに必要な、または通常使用される、プロパティの一部について説明します。 - 関数名。 - UDF 名は、ハンドラーメソッドの名前と一致する必要はありません。CREATE FUNCTIONステートメントは、UDF名をハンドラーに関連付けます。 - 名前の制約と規則の詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。 
- 関数の引数(存在する場合)。 - UDFs およびストアドプロシージャの引数の定義 をご参照ください。 
- RETURNS 句を使用した戻り型。 - スカラー戻り値の場合、 RETURNS 句は単一の戻り型を指定します。表形式の戻り値の場合、 RETURNS は、表形式内にある戻り値の列の型を指定する TABLE キーワードを指定します。 - Snowflakeが SQL データ型をハンドラーデータ型にマップする方法については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。 
- HANDLER 句を使用したハンドラー名。 - 必要な場合、これは UDF が呼び出されたときに実行されるコードを含むクラスまたはメソッドの名前です。JavaおよびPythonで記述されたハンドラーの場合にのみ、ハンドラー名を指定する必要があります。JavaScript および SQL ハンドラーの場合、インラインで指定されたすべてのコードがハンドラーとして実行されます。 - 次のテーブルは、ハンドラー言語と関数の型に基づく HANDLER 句の値の形式を示しています。 - ハンドラー言語 - UDF - UDTF - Java - クラスとメソッド名。 - 例: - MyClass.myMethod- クラス名のみ。ハンドラーメソッド名は、必要なインターフェイスによって事前に決定されます。 - JavaScript - なし。 - なし。 - Python - クラスが使用されている場合は、クラスとメソッド名。それ以外の場合は、関数名。 - 例: - module.my_functionまたは- my_function- クラス名のみ。ハンドラーメソッド名は、必要なインターフェイスによって事前に決定されます。 - SQL - なし。 - なし。 
- IMPORTS または PACKAGES 句を使用したハンドラーが必要とする依存関係(存在する場合)。 - ハンドラーで依存関係を利用できるようにする方法の詳細については、 コードで依存関係を利用できるようにする方法 をご参照ください。 
- RUNTIME_VERSION 句を使用したハンドラー言語ランタイム。 - ハンドラー言語がJavaまたはPythonの場合は、 RUNTIME_VERSION 句を使用して、使用するサポートされているランタイムバージョンを指定します。句を省略すると、Snowflakeに対してデフォルトを使用するように求められますが、これは将来変更される可能性があります。