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