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

以下示例中的代码调用匿名过程,将 sp 变量及 1 作为实参传递。请注意, Session 对象是隐式实参,在调用过程时无需传递该实参。

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

创建命名的临时过程

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

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

以下示例中的代码调用 increment 过程,将过程名称和 1 作为实参传递。请注意, Session 对象是隐式实参,在调用过程时无需传递该实参。

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

创建永久存储过程

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

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

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