스칼라 사용자 정의 함수
스칼라 사용자 정의 함수 (UDFs)
UDF(User-Defined Function)는 한 행(row)에 동작하는 사용자가 프로그래밍한 루틴이에요. 이 문서는 UDF를 생성하고 등록하는 데 필요한 클래스들과, UDF를 정의·등록한 뒤 Spark SQL에서 호출하는 방법을 보여주는 예제를 담고 있어요.
출처: 문서
본문
설명 (Description)
사용자 정의 함수(UDFs)는 한 행에 동작하는 사용자가 프로그래밍할 수 있는 루틴이에요. 이 문서는 UDF를 생성하고 등록하는 데 필요한 클래스들을 나열해요. 또한 UDF를 정의하고 등록한 뒤 Spark SQL에서 호출하는 방법을 보여주는 예제도 포함하고 있어요.
UserDefinedFunction
사용자 정의 함수의 속성을 정의하기 위해, 사용자는 이 클래스에 정의된 몇 가지 메서드를 사용할 수 있어요.
-
asNonNullable(): UserDefinedFunction
UserDefinedFunction을 non-nullable로 업데이트해요.
-
asNondeterministic(): UserDefinedFunction
UserDefinedFunction을 nondeterministic(비결정적)으로 업데이트해요.
-
withName(name: String): UserDefinedFunction
주어진 이름으로 UserDefinedFunction을 업데이트해요.
예제 (Examples)
Scala 예제:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.udf
val spark = SparkSession
.builder()
.appName("Spark SQL UDF scalar example")
.getOrCreate()
// Define and register a zero-argument non-deterministic UDF
// UDF is deterministic by default, i.e. produces the same result for the same input.
val random = udf(() => Math.random())
spark.udf.register("random", random.asNondeterministic())
spark.sql("SELECT random()").show()
// +-------+
// |UDF() |
// +-------+
// |xxxxxxx|
// +-------+
// Define and register a one-argument UDF
val plusOne = udf((x: Int) => x + 1)
spark.udf.register("plusOne", plusOne)
spark.sql("SELECT plusOne(5)").show()
// +------+
// |UDF(5)|
// +------+
// | 6|
// +------+
// Define a two-argument UDF and register it with Spark in one step
spark.udf.register("strLenScala", (_: String).length + (_: Int))
spark.sql("SELECT strLenScala('test', 1)").show()
// +--------------------+
// |strLenScala(test, 1)|
// +--------------------+
// | 5|
// +--------------------+
// UDF in a WHERE clause
spark.udf.register("oneArgFilter", (n: Int) => { n > 5 })
spark.range(1, 10).createOrReplaceTempView("test")
spark.sql("SELECT * FROM test WHERE oneArgFilter(id)").show()
// +---+
// | id|
// +---+
// | 6|
// | 7|
// | 8|
// | 9|
// +---+
전체 예제 코드는 Spark 저장소의 "examples/src/main/scala/org/apache/spark/examples/sql/UserDefinedScalar.scala"에서 찾을 수 있어요.
Java 예제:
import org.apache.spark.sql.*;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.expressions.UserDefinedFunction;
import static org.apache.spark.sql.functions.udf;
import org.apache.spark.sql.types.DataTypes;
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL UDF scalar example")
.getOrCreate();
// Define and register a zero-argument non-deterministic UDF
// UDF is deterministic by default, i.e. produces the same result for the same input.
UserDefinedFunction random = udf(
() -> Math.random(), DataTypes.DoubleType
);
random.asNondeterministic();
spark.udf().register("random", random);
spark.sql("SELECT random()").show();
// +-------+
// |UDF() |
// +-------+
// |xxxxxxx|
// +-------+
// Define and register a one-argument UDF
spark.udf().register("plusOne",
(UDF1<Integer, Integer>) x -> x + 1, DataTypes.IntegerType);
spark.sql("SELECT plusOne(5)").show();
// +----------+
// |plusOne(5)|
// +----------+
// | 6|
// +----------+
// Define and register a two-argument UDF
UserDefinedFunction strLen = udf(
(String s, Integer x) -> s.length() + x, DataTypes.IntegerType
);
spark.udf().register("strLen", strLen);
spark.sql("SELECT strLen('test', 1)").show();
// +------------+
// |UDF(test, 1)|
// +------------+
// | 5|
// +------------+
// UDF in a WHERE clause
spark.udf().register("oneArgFilter",
(UDF1<Long, Boolean>) x -> x > 5, DataTypes.BooleanType);
spark.range(1, 10).createOrReplaceTempView("test");
spark.sql("SELECT * FROM test WHERE oneArgFilter(id)").show();
// +---+
// | id|
// +---+
// | 6|
// | 7|
// | 8|
// | 9|
// +---+
전체 예제 코드는 Spark 저장소의 "examples/src/main/java/org/apache/spark/examples/sql/JavaUserDefinedScalar.java"에서 찾을 수 있어요.
관련 구문 (Related Statements)
더 알아보기 (Learn more)
- 아파치 스파크 SQL 참조 (원문)
- User Defined Aggregate Functions (UDAFs) — 사용자 정의 집계 함수
- Integration with Hive UDFs/UDAFs/UDTFs — Hive UDF 통합
- Functions — 함수 전반 문서