Python UDFsの紹介

このトピックでは、Python UDFsを紹介し、Python UDFをいつ使用するかを決定するのに役立つ情報を提供します。

このトピックの内容:

Python UDFとは何ですか?

UDF (ユーザー定義関数)は、組み込み関数を呼び出すのと同じ方法でSnowflakeから呼び出すことができるユーザー作成関数です。

Snowflakeは、Pythonなど、複数の言語で記述されたUDFsをサポートしています。

Python UDFsはスカラー関数です。UDFに渡される行ごとに、UDFは値を返します。

UDFs は0以上のパラメーターを受け入れます。

ユーザーが UDF を呼び出すと、ユーザーは UDF の名前と UDF のパラメーターをSnowflakeに渡します。UDFがPython UDFの場合、Snowflakeは適切なPythonコード(ハンドラー関数 と呼ばれます)を呼び出します。次に、ハンドラー関数は出力をSnowflakeに返し、Snowflakeはそれをクライアントに返します。

Python UDFsには、新しいコードと既存パッケージへの呼び出しの両方を含めることができるため柔軟性があり、コードの再利用も可能です。例えば、Pythonでデータ分析コードをすでに持っている場合は、大抵Python UDFに組み込むことができます。

Snowflakeは現在、Pythonバージョン3.8でのUDFsの記述をサポートしています。

Anacondaとのパートナーシップを通じて、サードパーティのPythonパッケージがSnowflakeによって提供されています。詳細については、 サードパーティパッケージの使用 をご参照ください。

注釈

Python UDFのバッチAPIがあります。これにより、入力行のバッチを Pandas DataFrames として受け取り、結果のバッチを Pandas配列 または シリーズ として返すPython関数を定義できます。詳細については、 Python UDFのバッチAPI をご参照ください。

Python UDFをいつ使用するかの決定

UDFs を書き込む他の潜在的な言語の情報、およびそれらの言語間の比較については、 UDFs の概要 をご参照ください。

Snowflakeを拡張する他の方法については、以下をご参照ください。

Python UDFsの利点

Python UDFsは、次の1つ以上が当てはまる場合に特に適しています。

  • 使用できるPythonコード(ソースまたはコンパイル済み)がすでにある。

  • コードは、標準のPythonライブラリにすでに存在する関数を使用する(または使用する可能性がある)。

  • UDFsをサポートする他の言語と同程度、あるいはそれ以上、Pythonに対する知識がある。

  • Pythonの豊富なサードパーティエコシステムを利用したいと考えている。

Python UDFsの制限

一般的な制限

  • Python関数は標準Pythonパッケージのモジュールと関数を使用できますが、Snowflakeのセキュリティ制約により、ネットワークアクセスやファイルへの書き込みなどの一部の機能が無効になります。詳細については、 優れたセキュリティプラクティスに準拠 というタイトルのセクションをご参照ください。

  • ステージを通じて持ち込まれるすべてのUDFsおよびモジュールは、プラットフォームに依存しない必要があり、ネイティブ拡張を含めることはできません。

    • 特定の CPU アーキテクチャ(例: x86)を想定したコードは避けます。

    • 特定のオペレーティングシステムを想定したコードは避けます。

  • Python UDFsは共有できません。Python UDFsを使用するデータベースオブジェクトも共有できません。たとえば、次は実行できません。

    • Python UDFを直接共有する。

    • Python UDF を呼び出すビューを共有する。

    • Python UDFを呼び出す関数を共有する。

    • Python UDFを呼び出すマスキングまたは行アクセスポリシーを使用してテーブルを共有する。

  • Python UDFで USAGE権限を付与すると、受信者はそのUDFによってインポートされたファイルの内容を表示できる場合があります。Python UDFに対するUSAGE権限をロールに付与し、そのロールがそのPython UDFを呼び出すステートメントを実行する場合、同じステートメント内の任意のPython UDFは、USAGE権限を付与されたPython UDFによってインポートされた任意のファイルの内容を読み取ることができます。

  • データベース複製はインラインPython UDFs でサポートされています。ただし、Python UDF がステージ内のファイル(つまり、 IMPORTS 句を使用して作成された関数)に依存している場合、複製はブロックされます。この制限は、将来のバージョンで削除される可能性があります。

  • SnowflakeはPython zipimport モジュールを使用して、ステージからPythonコードをインポートします。その結果、 zipimport の制限もUDFsに存在します。 zipimport の詳細については、 zipimportリファレンス をご参照ください。

クローニングの制限

Python UDFは、Python UDFを含むデータベースまたはスキーマがクローンされるときに、クローンできます。クローンを作成するには、Python UDFが次の条件を満たす必要があります。

  • Python UDFがステージを参照する場合、そのステージは、クローンされるスキーマ(またはデータベース)の 外部 にある必要があります。

    次の方法で、Python UDFと参照ステージを別々のスキーマ(および/または別々のデータベース)に保持できます。

    • Python UDFがステージを参照する場合は常に、Python UDFのスキーマまたはデータベースとは異なる修飾ステージ名(例: 「my_db.my_schema.my_stage()」)を使用します。クローン作成操作でデータベースのクローンを作成する場合、ステージ参照にはデータベースとスキーマを含める必要があります。クローン作成操作でスキーマのクローンを作成する場合、ステージ参照にはスキーマ(およびオプションでデータベース)を含める必要があります。

    • 非修飾ステージ名(現在のセッションのアクティブなデータベースとスキーマを暗黙的に使用する)を使用して参照されるステージを作成し、セッションの現在のデータベースとスキーマと一致しない修飾名を使用してPython UDFを作成します。

    • ユーザーのステージを参照されるステージとして使用します(ユーザーのステージは、データベースのステージまたはスキーマのステージとは別のものです)。

スキーマまたはデータベース内の1つ以上のPython UDFsが必要な条件を満たしていない場合でも、スキーマまたはデータベースのクローンを作成できますが、非準拠のPython UDFsは、エラーまたは警告メッセージなしでクローンから省略されます。

クローンされた各Python UDFは、元のPythonと同じ定義を持っています。その定義には、ステージへの参照が含まれます。Python UDFのステージ参照は完全修飾されている必要があるため、クローンを作成するスキーマやデータベースに相対するものではなく、絶対的なものです。オリジナルとクローンの両方が同じステージとファイルをポイントしているため、

  • ステージをドロップするか、ステージから必要なファイルを削除すると、元とクローンされた UDF の両方が無効になります。

  • ステージまたはステージ上のファイルを変更すると、元とクローンされたUDFの両方に影響します。