为代码提供依赖项¶
当用户定义函数 (UDF) 或存储过程依赖于 UDF 或过程外部的代码或文件时,可以将这种依赖项上传到某个暂存区,然后在该位置引用它,从而使其对 UDF 或过程可用。
例如,您可能希望 UDF 或过程能够访问以下内容:
模块中的 Python 处理程序代码。
编译并打包在 JAR 中的 Java 或 Scala 处理程序代码。
用 Java、Python 或 Scala 编写的依赖项代码。
由处理程序代码读取的文件,其名称和位置在创建 UDF 时是已知的。例如,这对于配置文件很有用。
备注
还可以使用 CREATE FUNCTION 或 CREATE PROCEDURE 的 PACKAGES 子句导入 Snowflake 中包含的库。
本主题内容:
概括性步骤¶
按照以下步骤使依赖项可用于函数或过程。
当创建函数或过程时,使用 IMPORTS 引用依赖项。
为依赖项文件选择或创建暂存区¶
若要使依赖项文件可用于函数或过程,需要将依赖项文件复制到可在运行时访问它的暂存区。函数或过程的所有者必须对该暂存区具有 READ 权限。
通常,使用 PUT 命令将依赖项上传到命名的内部暂存区。有关创建暂存区的详细信息,请参阅 CREATE STAGE。
备注
不能通过 Snowflake GUI 执行 PUT
命令;可以使用 SnowSQL 来执行 PUT
。有关将 .jar 文件复制到暂存区的 PUT
命令示例,请参阅本主题中的 将依赖项上传到暂存区。
为您的依赖项选择或创建以下类型的暂存区之一:
用户或命名的内部暂存区。
如果计划使用
PUT
命令上传文件,请使用命名的内部暂存区。有关选择内部暂存区类型的更多信息,请参阅 为本地文件选择内部暂存区。外部暂存区。
外部暂存区是与外部存储服务相关联的位置,如 CREATE STAGE 中所述。
PUT
命令不支持将文件上传到外部暂存区。
可以使用现有暂存区,也可以通过执行 CREATE STAGE 来创建新暂存区。例如,以下命令创建一个名为 mystage
的新内部暂存区:
CREATE STAGE mystage;
备注
Snowflake 当前不支持使用表暂存区来存储处理程序代码。
将依赖项上传到暂存区¶
将存储过程所需的文件上传到暂存区。
如果使用外部暂存区,请使用该存储服务的方式上传文件。如果使用内部暂存区,可以使用 PUT
命令将文件从本地驱动器复制到暂存区。有关命令参考,请参阅 PUT。有关使用 PUT 暂存文件的信息,请参阅 从本地文件系统暂存数据文件。
使用 PUT
命令将文件上传到暂存区。
以下示例中的代码将 myjar.jar
上传到一个名为 mystage
的暂存区,覆盖同名的现有文件(如果存在)。
PUT file:///Users/MyUserName/MyCompiledJavaCode.jar
@mystage
AUTO_COMPRESS = FALSE
OVERWRITE = TRUE
;
备注
如果省略 AUTO_COMPRESS = FALSE
,PUT 命令将自动压缩文件。暂存区中压缩文件的名称将是 myjar.jar.gz
。稍后,执行命令(如 CREATE PROCEDURE)时,将需要在命令的 IMPORTS 子句中指定带有此 .gz
扩展名的文件名。
备注
PUT 命令不支持将文件上传到外部暂存区。要将文件上传到外部暂存区,请使用云服务提供的实用程序。
引用依赖项¶
要使正在创建的函数或过程知道依赖项的位置,请在用于创建函数或过程的 SQL 的 IMPORTS 子句中指定依赖项的位置。
如果您有多个依赖项文件,例如当有处理程序所依赖的第三方库时,可以将所有依赖项文件的暂存区位置和文件路径及名称指定为 IMPORTS 子句的值。
以下示例中的代码创建了一个名为 MYPROC
的过程,指定 MyCompiledJavaCode.jar
文件(在 mystage
暂存区中)应包含在该过程的执行环境中。在这种情况下,MyCompiledJavaCode.jar
包含过程的处理程序 MyJavaClass.run
的编译代码。
CREATE OR REPLACE PROCEDURE MYPROC(value INT, fromTable STRING, toTable STRING, count INT)
RETURNS INT
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:snowpark:latest')
IMPORTS = ('@mystage/MyCompiledJavaCode.jar')
HANDLER = 'MyJavaClass.run';