在 Scala 中为 DataFrames 创建存储过程¶
通过使用 Snowpark API,您可以为自定义 lambda 和函数创建存储过程。您可以调用这些存储过程来处理 DataFrame 中的数据。
您可以创建:
仅存在于当前会话内的 :ref:` 临时存储过程 <label-snowpark_scala_stored_proc_create_temp>`。
可以在其他会话(包括 Snowflake 工作表)中使用的 :ref:` 永久存储过程 <label-snowpark_scala_stored_proc_create_permanent>`。
创建临时存储过程¶
您可以创建仅在当前会话中使用的临时过程。临时过程可以是:
可通过引用来调用的匿名过程(例如,将表示过程的 ` com.snowflake.snowpark.StoredProcedure `_ 变量传递给调用过程的代码)。
具有指定名称的命名过程。您可以从会话中的其他代码中按名称调用过程。
要创建临时过程,请使用 ` com.snowflake.snowpark.SProcRegistration _ 的一种 :code:`registerTemporary 方法注册该过程。多次重载此方法,以支持不同数量的过程实参。
在调用 registerTemporary
时,您可以将以下内容作为实参传递:
过程的名称(当过程是命名过程时)。
作为 lambda 表达式的过程本身。
创建匿名临时过程¶
要创建匿名临时过程,请将其注册为临时过程,而无需指定名称。Snowflake 将创建一个隐藏名称供自己使用。
以下示例中的代码调用 SProcRegistration.registerTemporary
方法,以通过 lambda 函数创建匿名过程。此函数本身将以一个 Session
对象和整数作为实参。Session
实参表示调用方无需将其作为实参传递的隐式实参。
val session = Session.builder.configFile("my_config.properties").create
val sp = session.sproc.registerTemporary(
(session: Session, num: Int) => num + 1
)
以下示例中的代码使用 ` com.snowflake.snowpark.Session _ 类的 :code:`storedProcedure 方法调用匿名过程,并将 sp
变量和 1
作为其实参传递。请注意, Session
对象是隐式实参,在调用过程时无需传递该实参。
session.storedProcedure(sp, 1).show()
创建命名的临时过程¶
要创建命名的临时过程,请将其注册为临时过程,并将其名称作为实参之一传递。
以下示例中的代码调用 registerTemporary
方法,以通过 Lambda 表达式创建名为 add_two
的命名临时过程,并将过程的名称作为实参传递。该方法将 Int
注册为单个参数类型。
过程本身将以一个 Session
对象和整数作为实参。Session
实参表示调用方无需将其作为实参传递的隐式实参。
val session = Session.builder.configFile("my_config.properties").create
val procName: String = "add_two"
val tempSP: StoredProcedure =
session.sproc.registerTemporary(
procName,
(session: Session, num: Int) => num + 2)
以下示例中的代码使用 ` com.snowflake.snowpark.Session _ 类的 :code:`storedProcedure 方法调用 add_two
过程,并将过程名称和 1
作为其实参传递。请注意, Session
对象是隐式实参,在调用过程时无需传递该实参。
session.storedProcedure(procName, 1).show()
创建永久存储过程¶
您可以创建可从任何会话(包括 从 Snowflake 工作表内)调用的永久存储过程。
要创建永久过程,请使用 ` com.snowflake.snowpark.SProcRegistration _ 类的 :code:`registerPermanent 方法注册该过程。此方法会被多次重载,以支持各种过程要求。
在调用 registerPermanent
时,将以下内容作为实参传递:
过程的名称。
作为 lambda 表达式的过程本身。
Snowflake 应将编译过程生成的文件复制到的现有暂存区。
Snowflake 将复制所有相关数据,包括依赖项和 Lambda 函数。此暂存区必须是永久暂存区(不是会话临时暂存区),因为在当前会话外部可以调用此存储过程。如果稍后删除该过程,您必须手动从暂存区中移除相关文件。
布尔值,指示是否应使用调用方的权限执行此过程。
有关调用方权限和所有者权限的更多信息,请参阅 了解调用方权限和所有者权限存储过程。
以下示例中的代码调用 registerPermanent
方法,以通过 Lambda 表达式创建名为 add_hundred
的永久过程。
此方法为过程及其依赖项指定名为 sproc_libs
的暂存区。它还指定应使用调用方的权限执行该过程。
过程本身将以一个 Session
对象和整数作为实参。Session
实参表示调用方无需将其作为实参传递的隐式实参。
val session = Session.builder.configFile("my_config.properties").create
val procName: String = "add_hundred"
val stageName: String = "sproc_libs"
val sp: StoredProcedure =
session.sproc.registerPermanent(
procName,
(session: Session, num: Int) => num + 100,
stageName,
true
)
以下示例中的代码使用 ` com.snowflake.snowpark.Session _ 类的 :code:`storedProcedure 方法调用 add_hundred
过程。调用将过程名称和 1
作为其实参传递。请注意,处理程序中作为实参使用的 Session
对象是调用过程时无需传递的隐式实参。
session.storedProcedure(procName, 1).show()