为代码提供依赖项

当用户定义函数 (UDF) 或存储过程依赖于 UDF 或过程外部的代码或文件时,可以将这种依赖项上传到某个暂存区,然后在该位置引用它,从而使其对 UDF 或过程可用。

例如,您可能希望 UDF 或过程能够访问以下内容:

  • 模块中的 Python 处理程序代码。

  • 编译并打包在 JAR 中的 Java 或 Scala 处理程序代码。

  • 用 Java、Python 或 Scala 编写的依赖项代码。

  • 由处理程序代码读取的文件,其名称和位置在创建 UDF 时是已知的。例如,这对于配置文件很有用。

备注

还可以使用 CREATE FUNCTIONCREATE PROCEDURE 的 PACKAGES 子句导入 Snowflake 中包含的库。

本主题内容:

概括性步骤

按照以下步骤使依赖项可用于函数或过程。

  1. 选择或创建可供处理程序使用的暂存区

  2. 将依赖项上传到暂存区

  3. 当创建函数或过程时,使用 IMPORTS 引用依赖项

为依赖项文件选择或创建暂存区

若要使依赖项文件可用于函数或过程,需要将依赖项文件复制到可在运行时访问它的暂存区。函数或过程的所有者必须对该暂存区具有 READ 权限

通常,使用 PUT 命令将依赖项上传到命名的内部暂存区。有关创建暂存区的详细信息,请参阅 CREATE STAGE

备注

不能通过 Snowflake GUI 执行 PUT 命令;可以使用 SnowSQL 来执行 PUT。有关将 .jar 文件复制到暂存区的 PUT 命令示例,请参阅本主题中的 将依赖项上传到暂存区

为您的依赖项选择或创建以下类型的暂存区之一:

  • 用户或命名的内部暂存区。

    如果计划使用 PUT 命令上传文件,请使用命名的内部暂存区。有关选择内部暂存区类型的更多信息,请参阅 为本地文件选择内部暂存区

  • 外部暂存区。

    外部暂存区是与外部存储服务相关联的位置,如 CREATE STAGE 中所述。PUT 命令不支持将文件上传到外部暂存区。

可以使用现有暂存区,也可以通过执行 CREATE STAGE 来创建新暂存区。例如,以下命令创建一个名为 mystage 的新内部暂存区:

CREATE STAGE mystage;
Copy

备注

Snowflake 当前不支持使用表暂存区来存储处理程序代码。

将依赖项上传到暂存区

将存储过程所需的文件上传到暂存区。

如果使用外部暂存区,请使用该存储服务的方式上传文件。如果使用内部暂存区,可以使用 PUT 命令将文件从本地驱动器复制到暂存区。有关命令参考,请参阅 PUT。有关使用 PUT 暂存文件的信息,请参阅 从本地文件系统暂存数据文件

使用 PUT 命令将文件上传到暂存区。

以下示例中的代码将 myjar.jar 上传到一个名为 mystage 的暂存区,覆盖同名的现有文件(如果存在)。

PUT file:///Users/MyUserName/MyCompiledJavaCode.jar
  @mystage
  AUTO_COMPRESS = FALSE
  OVERWRITE = TRUE
  ;
Copy

备注

如果省略 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';
Copy
语言: 中文