Snowpark Javaでの関数の呼び出しとストアドプロシージャ¶
DataFrame でデータを処理するには、システム定義の SQL 関数、ユーザー定義関数、およびストアドプロシージャを呼び出すことができます。このトピックでは、Snowparkでこれらを呼び出す方法について説明します。
このトピックの内容:
システム定義関数の呼び出し¶
システム定義の SQL 関数 を呼び出す必要がある場合は、 関数クラス で同等の静的メソッドを使用します。
次の例では、 Functions
クラスの upper
静的メソッド(システム定義の UPPER 関数と同等)を呼び出して、名前列の値を大文字で返します。
DataFrame df = session.table("sample_product_data");
df.select(Functions.upper(Functions.col("name"))).show();
システム定義の SQL 関数が Functions
クラスで使用できない場合は、 Functions.callUDF
静的メソッドを使用してシステム定義関数を呼び出すことができます。
callUDF
の場合は、最初の引数としてシステム定義関数の名前を渡します。列の値をシステム定義関数に渡す必要がある場合は、 列 オブジェクトを 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();
callUDF
メソッドは、 Column
を返します。これは、 DataFrame 変換メソッド (例: フィルター、選択など)に渡すことができます。
Scalarユーザー定義関数(UDFs)の呼び出し¶
UDF を呼び出すメソッドは、 UDF がどのように作成されたかによって異なります。
匿名の UDF を呼び出すには、 UDF の作成時に返された UserDefinedFunction オブジェクトの
apply
メソッドを呼び出します。UDF に渡す引数は、 列 オブジェクトである必要があります。リテラルを渡す必要がある場合は、 列オブジェクトとしてのリテラルの使用 で説明されているように、
Functions.lit()
を使用します。名前で登録 した UDFs と、 CREATE FUNCTION を実行して作成した UDFs を呼び出すには、
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();
テーブル関数の呼び出し(システム関数と UDTFs)¶
テーブル関数 または ユーザー定義テーブル関数(UDTF) を呼び出すには、
TableFunction オブジェクトを作成し、テーブル関数の名前を渡します。
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
$$
;
次のコードではこれを 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();
テーブル関数の出力を DataFrame と結合する必要がある場合は、 TableFunction で渡す結合メソッド を呼び出します。
ストアドプロシージャの呼び出し¶
ストアドプロシージャを呼び出すには、 Session
クラスの sql
メソッドを使用します。 SQL ステートメントの実行 をご参照ください。