ユーザー定義関数の概要¶
ユーザー定義関数(UDFs)を記述して、Snowflakeが提供する 組み込みのシステム定義関数 では利用できない操作を実行するようにシステムを拡張できます。UDF を作成すると、何度でも再利用できます。関数は式を指定することで常に明示的に値を返すので、計算して値を返すのに適しています。
UDFs を使って、ビルトイン関数を拡張したり、組織で標準的な計算をカプセル化することができます。UDFs 作成した関数は組み込み関数と同様の方法で呼び出すことができます。
UDF のロジック(そのハンドラー)を、 サポートされている言語 のいずれかで記述します。ハンドラーができたら、 Snowflake に含まれるいくつかのツールのいずれかを使用して UDF を作成し、 UDF を実行 します。
UDF はストアドプロシージャに似ていますが、この2つは重要な点で異なります。詳細については、 ストアドプロシージャとユーザー定義関数のどちらを記述するかの選択 をご参照ください。
UDF は、Snowflakeを拡張する1つの方法にすぎません。その他については、次をご参照ください。
ユーザー定義関数のバリエーション¶
関数が満たすべき入力と出力の要件に応じて、 UDF をいくつかのバリエーションで書くことができます。
バリエーション |
説明 |
---|---|
ユーザー定義関数(UDF) |
また、 スカラー関数 としても知られ、各入力行に対して1つの出力行を返します。返される行は、単一の列/値で構成されます。 |
ユーザー定義集計関数 (UDAF) |
複数の行にまたがる値を演算子として、合計、平均、カウント、最小値または最大値の検索、標準偏差、推定などの数学的計算を実行します。 |
ユーザー定義テーブル関数 (UDTF) |
各入力行の表形式の値を返します。 |
ベクトル化ユーザー定義関数 (UDF) |
入力行のバッチを Pandas DataFrames として受け取り、結果のバッチを Pandas 配列 または Series として返します。 |
ベクトル化ユーザー定義テーブル関数 (UDTF) |
Pandas DataFrames として入力行のバッチを受け取り、表形式の結果を返します。 |
対応言語とツール¶
を作成し、 UDFs (およびその他の Snowflake エンティティ)を管理するには、作業方法に応じて複数のツールのいずれかを使用します。
言語 |
アプローチ |
サポート |
---|---|---|
SQL Java、 JavaScript、Python、Scala、または SQL のハンドラーを使用します。 |
Snowflakeで、Snowflakeエンティティを作成・管理する SQL コードを記述します。関数のロジックを、サポートされているハンドラー言語のいずれかで記述します。 |
|
Java、Python、またはScala |
クライアント上で、処理のためにSnowflakeにプッシュされる演算子のコードを記述します。 |
|
コマンドラインインターフェイス |
コマンドラインを使用して、 JSON オブジェクトのプロパティとしてプロパティを指定し、Snowflake エンティティを作成および管理します。 |
|
Python |
クライアントでは、コマンドを実行して Python で関数を作成し、サポートされているハンドラー言語のいずれかで関数のハンドラーを記述します。 |
|
REST |
RESTful エンドポイントにリクエストを行い、Snowflake エンティティを作成および管理します。 |
言語を選択するときは、次も考慮してください。
サポートされているハンドラーの場所。 すべての言語がステージ上のハンドラーの参照をサポートしているわけではありません(ハンドラーコードはインラインにする必要があります)。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
ハンドラーが共有可能な UDF になるかどうか。 共有可能な UDF は、Snowflakeの Secure Data Sharing 機能で使用できます。
言語 |
ハンドラーの場所 |
共有可能 |
---|---|---|
Java |
インラインまたはステージング |
不可 [1] |
JavaScript |
インライン |
有り |
Python |
インラインまたはステージング |
不可 [2] |
Scala |
インラインまたはステージング |
不可 [3] |
SQL |
インライン |
有り |
考慮事項¶
クエリが UDF を呼び出してステージングされたファイルにアクセスする場合に、 SQL ステートメントが UDF またはUDTF の いずれか を呼び出すビューもクエリすると、ビューにある関数がステージングされたファイルにアクセスするかどうかにかかわらず、操作に失敗してユーザーエラーが発生します。
UDTFs 複数のファイルを並行して処理できます。ただし、 UDFs は現在、ファイルをシリアルに処理しています。回避策として、 GROUP BY 句を使用してサブクエリの行をグループ化します。例については、 UDTF を使用して CSV を処理する をご参照ください。
現在、クエリで参照されているステージングされたファイルが、クエリの実行中に変更または削除された場合、関数の呼び出しはエラーを発生して失敗します。
UDF のハンドラーコードで CURRENT_DATABASE または CURRENT_SCHEMA 関数を指定すると、この関数は、セッションで使用中のデータベースまたはスキーマではなく、 UDF を含むデータベースまたはスキーマを返します。
UDF の例¶
次の例のコードは、Pythonで記述されたハンドラーを使用して addone
という名前の UDF を作成します。ハンドラー関数は addone_py
です。この UDF は int
を返します。
CREATE OR REPLACE FUNCTION addone(i int)
RETURNS INT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
HANDLER = 'addone_py'
as
$$
def addone_py(i):
return i+1
$$;
次の例のコードは、 addone
UDF を実行します。
SELECT addone(3);
ガイドラインと制約¶
- Snowflakeの制約:
Snowflakeの制約内で開発することにより、Snowflake環境内での安定性を確保できます。詳細については、 Snowflakeが課す制約内でのハンドラーの設計 をご参照ください。
- 命名:
他の関数との競合を避ける方法で関数に名前を付けるようにしてください。詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。
- 引数:
引数を指定し、どの引数がオプションであるかを示します。詳細については、 UDFs およびストアドプロシージャの引数の定義 をご参照ください。
- データ型マッピング:
ハンドラー言語ごとに、言語のデータ型と、引数および戻り値に使用される SQL 型との間に個別のマッピングのセットがあります。各言語のマッピングの詳細については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。
ハンドラーの記述¶
- ハンドラー言語:
ハンドラーの記述に関する言語固有のコンテンツについては、 対応言語とツール をご参照ください。
- 外部ネットワークアクセス:
外部ネットワークアクセス で外部ネットワークロケーションにアクセスできます。Snowflakeの外部にある特定のネットワークロケーションへのセキュアアクセスを作成して、ハンドラーコード内からそのアクセスを使用することができます。
- ロギング、トレース、メトリクス:
コード・アクティビティを記録するには、 ログ・メッセージ、トレース・イベント、メトリクス・データ をキャプチャし、後でクエリできるデータベースにデータを保存します。
セキュリティ¶
UDF または UDTF を使用して特定の SQL アクションを実行するために必要な権限をオブジェクトに対して付与できます。詳細については、 ユーザー定義関数の権限付与 をご参照ください
関数は、ストアドプロシージャと特定のセキュリティ上の問題を共有しています。詳細については、次をご参照ください。
UDFs とプロシージャのセキュリティプラクティス で説明されているベストプラクティスに従うと、プロシージャのハンドラーコードを安全に実行することができます。
機密情報は、アクセスしてはならないユーザーから隠されていることを確認してください。詳細については、 セキュア UDFs とストアドプロシージャの使用による機密情報の保護 をご参照ください
ハンドラーコードのデプロイメント¶
関数を作成するとき、関数のロジックを実装するハンドラーを、関数定義とインラインのコードとして指定することも、パッケージ化されてステージにコピーされたコードなど、定義の外部のコードとして指定することもできます。
詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。