Snowpark Java에서 함수 및 저장 프로시저 호출하기

DataFrame에서 데이터를 처리하기 위해 시스템 정의 SQL 함수, 사용자 정의 함수, 저장 프로시저를 호출할 수 있습니다. 이 항목에서는 Snowpark에서 이를 호출하는 방법에 대해 설명합니다.

이 항목의 내용:

시스템 정의 함수 호출하기

시스템 정의 SQL 함수 를 호출해야 하는 경우, Functions 클래스 에서 이와 동일한 정적 메서드를 사용하십시오.

다음 예에서는 Functions 클래스의 upper 정적 메서드(시스템 정의 UPPER 함수와 동일)를 호출하여, 대문자로 된 이름 열의 값을 반환합니다.

DataFrame df = session.table("sample_product_data");
df.select(Functions.upper(Functions.col("name"))).show();
Copy

Functions 클래스에서 시스템 정의 SQL 함수를 사용할 수 없는 경우, Functions.callUDF 정적 메서드를 사용하여 시스템 정의 함수를 호출할 수 있습니다.

callUDF 의 경우, 시스템 정의 함수의 이름을 첫 번째 인자로 전달합니다. 열 값을 시스템 정의 함수에 전달해야 하는 경우, Column 오브젝트를 정의하고 callUDF 메서드에 대한 추가 인자로서 전달하십시오.

다음 예에서는 시스템 정의 함수 RADIANS 를 호출하여 degrees 열의 값을 전달합니다.

// Call the system-defined function RADIANS() on degrees.
DataFrame dfDegrees = session.range(0, 360, 45).rename("degrees", Functions.col("id"));
dfDegrees.select(Functions.col("degrees"), Functions.callUDF("radians", Functions.col("degrees"))).show();
Copy

callUDF 메서드는 DataFrame 변환 메서드 (예: filter, select 등)에 전달할 수 있는 Column 을 반환합니다.

스칼라 사용자 정의 함수(UDF) 호출하기

UDF를 호출하는 방법은 UDF가 생성된 방식에 따라 다릅니다.

  • 익명 UDF 를 호출하려면 UDF 생성 시 반환된 UserDefinedFunction 오브젝트의 apply 메서드를 호출합니다.

    UDF에 전달하는 인자는 Column 오브젝트여야 합니다. 리터럴을 전달해야 하는 경우 리터럴을 열 오브젝트로 사용하기 에 설명된 대로 Functions.lit() 를 사용하십시오.

  • 이름으로 등록한 UDF, 그리고 CREATE FUNCTION 을 실행하여 만든 UDF를 호출하려면 Functions.callUDF 정적 메서드를 사용하십시오.

    UDF의 이름을 첫 번째 인자로서 전달하고 모든 UDF 매개 변수를 추가 인자로서 전달하십시오.

UDF를 호출하면 UDF의 반환 값이 포함된 Column 오브젝트가 반환됩니다.

다음 예에서는 UDF 함수 doubleUdf 을 호출하여 quantity 열의 값을 전달합니다. 이 예에서는 doubleUdf 의 반환 값을 DataFrame의 select 메서드로 전달합니다.

import com.snowflake.snowpark_java.types.*;
...
// Create and register a temporary named UDF
// that takes in an integer argument and returns an integer value.
UserDefinedFunction doubleUdf =
  session
    .udf()
    .registerTemporary(
      "doubleUdf",
      (Integer x) -> x + x,
      DataTypes.IntegerType,
      DataTypes.IntegerType);
// Call the named UDF, passing in the "quantity" column.
// The example uses withColumn to return a DataFrame containing
// the UDF result in a new column named "doubleQuantity".
DataFrame df = session.table("sample_product_data");
DataFrame dfWithDoubleQuantity = df.withColumn("doubleQuantity", doubleUdf.apply(Functions.col("quantity")));
dfWithDoubleQuantity.show();
Copy

테이블 함수 호출(시스템 함수 및 UDTF)

테이블 함수 또는 사용자 정의 테이블 함수(UDTF) 를 호출하려면 다음을 수행합니다.

  1. 테이블 함수의 이름을 전달하여 TableFunction 오브젝트를 생성합니다.

  2. Session 오브젝트의 tableFunction 메서드 를 호출하고 TableFunction 오브젝트와 입력 인자 이름 및 값의 Map 을 전달합니다.

table?Function 은 테이블 함수의 출력을 포함하는 DataFrame을 반환합니다.

예를 들어 다음 명령을 실행하여 SQL UDTF를 생성했다고 가정합니다.

CREATE OR REPLACE FUNCTION product_by_category_id(cat_id INT)
  RETURNS TABLE(id INT, name VARCHAR)
  AS
  $$
    SELECT id, name
      FROM sample_product_data
      WHERE category_id = cat_id
  $$
  ;
Copy

다음 코드는 이 UDTF를 호출하고, UDTF의 출력을 위한 DataFrame을 생성합니다. 이 예에서는 콘솔에 출력의 처음 10개 행을 출력합니다.

import java.util.HashMap;
import java.util.Map;
...

Map<String, Column> arguments = new HashMap<>();
arguments.put("cat_id", Functions.lit(10));
DataFrame dfTableFunctionOutput = session.tableFunction(new TableFunction("product_by_category_id"), arguments);
dfTableFunctionOutput.show();
Copy

테이블 함수의 출력을 DataFrame과 조인해야 하는 경우, TableFunction을 전달하는 join 메서드 를 호출합니다.

저장 프로시저 호출

저장 프로시저를 호출하려면 Session 클래스의 sql 메서드를 사용하십시오. SQL 문 실행하기 섹션을 참조하십시오.