Scala UDFs 简介¶
您可以用 Scala 为用户定义函数 (UDF) 编写处理程序。在 SQL 中调用函数时,处理程序将作为函数的逻辑执行。
Snowflake 目前支持使用 Scala 的以下版本编写 UDFs :
2.12
有了处理程序后,就可以用 SQL 创建 UDF。有关使用 SQL 创建或调用 UDF 的信息,请参阅 创建 UDF,或 调用 UDF。
有关 UDFs 的介绍,包括可用于编写 UDF 处理程序的语言列表,请参阅 用户定义函数概述。
备注
有关与 Scala 处理程序相关的限制,请参阅 Scala UDF 限制。
您还可以在使用 Snowpark API 时使用 Scala 编写 UDF。有关更多信息,请参阅 在 Scala 中为 DataFrames 创建用户定义的函数 (UDFs)。
处理程序的工作原理¶
当用户调用 UDF 时,用户将 UDF 的名称和实参传递给 Snowflake。Snowflake 调用与 UDF 关联的处理程序方法来执行 UDF 的逻辑。然后,处理程序方法将输出返回给 Snowflake,Snowflake 再将其传回给客户端。
对于标量函数(返回单个值的函数), UDF 会为传递给给 UDF 的每一行返回单一值。
为了支持处理程序的逻辑,代码可以调用处理程序外部的库。例如,如果您已经拥有使用 Scala 编写的数据分析代码,那么您或许可以在处理程序代码中使用它。
有关使用 Scala 编写处理程序的一般信息,请参阅 一般 Scala UDF 处理程序编码准则。有关编写标量函数的信息,请参阅 使用 Scala 编写标量 UDF。
示例¶
以下示例中的代码使用处理程序方法 TestFunc.echoVarchar
创建一个称为 echo_varchar
的 UDF。Snowflake 会根据 SQL-Scala 数据类型映射 中描述的映射将 Scala 实参和返回类型与 SQL 相互转换。
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = 2.12
HANDLER='TestFunc.echoVarchar'
AS
$$
class TestFunc {
def echoVarchar(x : String): String = {
return x
}
}
$$;
调用 UDF¶
SELECT echo_varchar('Hello');
设计注意事项¶
为设计有用的处理程序,请记住以下几点。
一般注意事项。 对于 UDFs 和过程的常见注意事项,请参阅 函数和过程的设计准则和约束。
保持在 Snowflake 施加的约束范围内。 有关设计在 Snowflake 上运行良好的处理程序代码的信息,请参阅 设计保持在 Snowflake 施加的约束范围内的处理程序。
SQL-Scala 类型映射。 当交换实参并使用 UDF 返回值时,Snowflake 在处理程序语言和 SQL 之间转换。有关选择处理程序代码的数据类型的更多信息,请参阅 SQL-Scala 数据类型映射。
代码打包。 您可以与 CREATE FUNCTION 语句内联以使处理程序代码可用,或将处理程序代码作为 JAR 中的编译代码以使其在暂存区上可用。如需了解相关区别,请参阅 将处理程序代码保持内联或保留在暂存区。
有关使用 sbt 打包 Scala 处理程序编译代码的信息,请参阅 使用 sbt 打包 Scala 处理程序代码。
代码优化。 有关优化处理程序代码的信息(例如当代码处理跨行共享的状态时),请参阅 在 Scalar Scala UDFs 中控制全局状态。
最佳实践。 有关最佳实践的信息,请参阅 最佳实践 和 UDFs 和过程的安全实践。
处理程序编码¶
从基础知识到详细示例,以下主题描述了如何使用 Scala 编写 UDF 处理程序。
一般准则。 有关处理程序编码的一般信息,包括处理错误、选择数据类型等,请参阅 一般 Scala UDF 处理程序编码准则。
编写标量函数 有关详细信息,请参阅 使用 Scala 编写标量 UDF。
日志记录和事件跟踪。 有关在处理程序代码执行时获取日志和跟踪数据的信息,请参阅 日志记录和跟踪概述。
代码示例 有关一系列处理程序示例,请参阅 Scala UDF 处理程序示例。
依赖项。您可以将依赖项上传到暂存区,使其在运行时可用于您的代码。有关更多信息,请参阅 为代码提供依赖项。
处理程序文件组织。 如果您打算将编译后的处理程序代码打包到 JAR 文件中进行暂存,请使用 Scala UDF 处理程序项目和打包 中的建议来组织和构建代码。