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。
使用用户暂存区作为引用暂存区(用户暂存区与任何数据库暂存区或架构暂存区是分开的)。
如果架构或数据库中的一个或多个 Scala UDFs 不满足所需的条件,则仍可以克隆架构或数据库,但从克隆中省略不合规的 Scala UDFs,而不会出现任何错误或警告消息。
每个克隆的 Scala UDF 都具有与原始版本相同的定义。该定义包括对暂存区的任何引用。Scala UDF 中的暂存区引用必须是完全限定的,因此是绝对的,与要克隆的架构或数据库无关。因为原始版本和克隆版本都指向相同的暂存区和文件:
弃用该暂存区或从暂存区中移除所需文件会禁用原始和克隆的 UDF。
更改暂存区或暂存区上的文件(例如,用较新的 JAR 文件替换 JAR 文件)会影响原始的和克隆的 UDF。