Python 함수(람다 함수 포함) 또는 사용자 정의 함수를 SQL 함수로 등록합니다.
문법
register(name, f, returnType=None)
매개 변수
| 매개 변수 | 유형 | 설명 |
|---|---|---|
name |
str | SQL 문의 사용자 정의 함수 이름입니다. |
f |
함수, udf또는 pandas_udf |
Python 함수 또는 사용자 정의 함수입니다. 사용자 정의 함수는 한 번에 행 또는 벡터화될 수 있습니다. |
returnType |
DataType 또는 str, 선택 사항 | 등록된 사용자 정의 함수의 반환 형식입니다. 개체 또는 DDL 형식 형식 문자열일 DataType 수 있습니다.
f 일반 Python 함수인 경우에만 유효하며, f 이미 사용자 정의 함수인 경우는 유효하지 않습니다. |
Returns
기능
Notes
비결정적 Python 함수를 등록하려면 먼저 Python 함수에 대한 비결정적 사용자 정의 함수를 빌드한 다음 SQL 함수로 등록합니다.
예제
# Register a lambda as a SQL function (return type defaults to string).
strlen = spark.udf.register("stringLengthString", lambda x: len(x))
spark.sql("SELECT stringLengthString('test')").collect()
# [Row(stringLengthString(test)='4')]
spark.sql("SELECT 'foo' AS text").select(strlen("text")).collect()
# [Row(stringLengthString(text)='3')]
# Register with an explicit return type.
from pyspark.sql.types import IntegerType
spark.udf.register("stringLengthInt", lambda x: len(x), IntegerType())
spark.sql("SELECT stringLengthInt('test')").collect()
# [Row(stringLengthInt(test)=4)]
# Register an existing UDF.
from pyspark.sql.functions import udf
slen = udf(lambda s: len(s), IntegerType())
spark.udf.register("slen", slen)
spark.sql("SELECT slen('test')").collect()
# [Row(slen(test)=4)]
# Register a nondeterministic UDF.
import random
random_udf = udf(lambda: random.randint(0, 100), IntegerType()).asNondeterministic()
spark.udf.register("random_udf", random_udf)
# Register a pandas UDF.
import pandas as pd
from pyspark.sql.functions import pandas_udf
@pandas_udf("integer")
def add_one(s: pd.Series) -> pd.Series:
return s + 1
spark.udf.register("add_one", add_one)
spark.sql("SELECT add_one(id) FROM range(3)").collect()
# [Row(add_one(id)=1), Row(add_one(id)=2), Row(add_one(id)=3)]
# Register a grouped aggregate pandas UDF.
@pandas_udf("integer")
def sum_udf(v: pd.Series) -> int:
return v.sum()
spark.udf.register("sum_udf", sum_udf)
spark.sql(
"SELECT sum_udf(v1) FROM VALUES (3, 0), (2, 0), (1, 1) tbl(v1, v2) GROUP BY v2"
).sort("sum_udf(v1)").collect()
# [Row(sum_udf(v1)=1), Row(sum_udf(v1)=5)]