Scala UDF の制限事項¶
このトピックでは、Scalaで記述されたハンドラーの制限事項について説明します。
一般的な制限¶
Scalaメソッドは標準ライブラリのクラスとメソッドを使用できますが、Snowflakeのセキュリティ制約により、ファイルへの書き込みなど、一部の機能が無効になります。詳細については、 UDFs とプロシージャのセキュリティプラクティス というタイトルのセクションをご参照ください。
Scala UDFs は共有できません。Scala UDFs を使用するデータベースオブジェクトも共有できません。たとえば、次は実行できません。
Scala UDF を直接共有する。
Scala UDF を呼び出すビューを共有する。
Scala UDF を呼び出す関数を共有する。
Scala UDF を呼び出すマスキングまたは行アクセスポリシーを使用してテーブルを共有する。
Scala UDF で USAGE 権限を付与すると、被付与者はその UDF によってインポートされたファイルの内容を表示できる場合があります。Scala UDFに対する USAGE 権限をロールに付与し、そのロールがそのScala UDF を呼び出すステートメントを実行する場合、同じステートメント内の任意のScala UDF は、 USAGE 権限を付与されたScala UDF によってインポートされた任意のファイルの内容を読み取ることができます。
データベース複製 には、外部ステージまたは内部ステージはまだ含まれていません。セカンダリデータベースをプライマリデータベースとして機能するように昇格する場合は、ステージオブジェクトを再作成し、内部ステージに欠落しているファイルを再インポートする必要があります。ファイルには、元のプライマリデータベースと同じパスとファイル名が必要です。
Scala UDF 出力行の最大サイズは16 MB です。
同時実行はサポートされていません。たとえば、コード内からは、複数のスレッドからクエリを送信することはできません。複数のクエリを同時に発行するコードはエラーを生成します。
クエリが UDF を呼び出してステージングされたファイルにアクセスする場合に、 SQL ステートメントが いずれか の UDF を呼び出すビューもクエリすると、ビューにある関数がステージングされたファイルにアクセスするかどうかにかかわらず、操作に失敗してユーザーエラーが発生します。
現在ファイルをシリアルに処理している UDFs。回避策として、 GROUP BY 句を使用してサブクエリの行をグループ化します。
現在、クエリで参照されているステージングされたファイルが、クエリの実行中に変更または削除された場合、関数の呼び出しはエラーを発生して失敗します。
クローニングの制限¶
Scala UDF は、Scala UDF を含むデータベースまたはスキーマがクローンされるときに、クローンできます。クローンを作成するには、Scala UDF が次の条件を満たす必要があります。
Scala UDF がステージ(例: UDF の JAR ファイルを含むステージ)を参照する場合、そのステージは、クローンされるスキーマ(またはデータベース)の 外部 にある必要があります。
次の方法で、Scala UDF と参照ステージを個別のスキーマ(および/または個別のデータベース)に保持できます。
Scala UDF がステージを参照する場合は常に、Scala UDF のスキーマまたはデータベースとは異なる修飾ステージ名(
my_db.my_schema.my_stage
など)を使用します。クローン作成操作でデータベースのクローンを作成する場合、ステージ参照にはデータベースとスキーマを含める必要があります。クローン作成操作でスキーマのクローンを作成する場合、ステージ参照にはスキーマ(およびオプションでデータベース)を含める必要があります。非修飾ステージ名(現在のセッションのアクティブなデータベースとスキーマを暗黙的に使用する)を使用して参照されるステージを作成し、セッションの現在のデータベースまたスキーマと一致しない修飾名を使用してScala UDF を作成します。
ユーザーのステージを参照されるステージとして使用します(ユーザーのステージは、データベースのステージまたはスキーマのステージとは別のものです)。
スキーマまたはデータベース内の1つ以上のScala UDFs が必要な条件を満たしていない場合でも、スキーマまたはデータベースのクローンを作成できますが、非準拠のScaka UDFs は、エラーまたは警告メッセージなしでクローンから省略されます。
クローンされた各Scala UDF は、元のScalaと同じ定義を持っています。その定義には、ステージへの参照が含まれます。Scala UDF のステージ参照は完全修飾されている必要があるため、クローンを作成するスキーマやデータベースに相対するものではなく、絶対的なものです。オリジナルとクローンの両方が同じステージとファイルをポイントしているため、
ステージをドロップするか、ステージから必要なファイルを削除すると、元とクローンされた UDF の両方が無効になります。
ステージまたはステージ上のファイルを変更すると(例: JAR ファイルを新しい JAR ファイルに置き換える)、元とクローンされた UDF の両方に影響します。