在 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
)
Copy

以下示例中的代码使用 ` com.snowflake.snowpark.Session _ 类的 :code:`storedProcedure 方法调用匿名过程,并将 sp 变量和 1 作为其实参传递。请注意, Session 对象是隐式实参,在调用过程时无需传递该实参。

session.storedProcedure(sp, 1).show()
Copy

创建命名的临时过程

要创建命名的临时过程,请将其注册为临时过程,并将其名称作为实参之一传递。

以下示例中的代码调用 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)
Copy

以下示例中的代码使用 ` com.snowflake.snowpark.Session _ 类的 :code:`storedProcedure 方法调用 add_two 过程,并将过程名称和 1 作为其实参传递。请注意, Session 对象是隐式实参,在调用过程时无需传递该实参。

session.storedProcedure(procName, 1).show()
Copy

创建永久存储过程

您可以创建可从任何会话(包括 从 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
  )
Copy

以下示例中的代码使用 ` com.snowflake.snowpark.Session _ 类的 :code:`storedProcedure 方法调用 add_hundred 过程。调用将过程名称和 1 作为其实参传递。请注意,处理程序中作为实参使用的 Session 对象是调用过程时无需传递的隐式实参。

session.storedProcedure(procName, 1).show()
Copy
语言: 中文