Share via


UDF(사용자 정의 함수)란?

UDF(사용자 정의 함수)는 사용자 환경에서 사용자 지정 논리를 다시 사용할 수 있도록 사용자가 정의한 함수입니다. Azure Databricks는 확장 가능한 논리를 배포할 수 있도록 다양한 유형의 UDF를 지원합니다. 이 문서에서는 UDF의 일반적인 장점과 제한 사항을 소개합니다.

참고 항목

Azure Databricks의 모든 실행 환경에서 모든 형태의 UDF를 사용할 수 있는 것은 아닙니다. Unity 카탈로그를 사용하는 경우 Unity 카탈로그의 UDF(사용자 정의 함수)를 참조하세요.

UDF에 대한 자세한 내용은 다음 문서를 참조하세요.

serialization 페널티 없이 사용자 지정 논리 정의

Azure Databricks는 많은 유형의 UDF에 대한 효율성 제한을 포함하여 Apache Spark에서 대부분의 UDF 동작을 상속합니다. 가장 효율적인 UDF를 확인하세요.

UDF와 관련된 잠재적인 효율성 절충에 대해 걱정하지 않고도 코드를 안전하게 모듈화할 수 있습니다. 이렇게 하려면 SQL 또는 Spark DataFrames를 사용하여 일련의 Spark 기본 제공 메서드로 논리를 정의해야 합니다. 예를 들어 다음 SQL 및 Python 함수는 Spark 기본 제공 메서드를 결합하여 단위 변환을 재사용 가능한 함수로 정의합니다.

SQL

CREATE FUNCTION convert_f_to_c(unit STRING, temp DOUBLE)
RETURNS DOUBLE
RETURN CASE
  WHEN unit = "F" THEN (temp - 32) * (5/9)
  ELSE temp
END;

SELECT convert_f_to_c(unit, temp) AS c_temp
FROM tv_temp;

Python

def convertFtoC(unitCol, tempCol):
  from pyspark.sql.functions import when
  return when(unitCol == "F", (tempCol - 32) * (5/9)).otherwise(tempCol)

from pyspark.sql.functions import col

df_query = df.select(convertFtoC(col("unit"), col("temp"))).toDF("c_temp")
display(df_query)

위의 UDF를 실행하려면 예제 데이터를 만들면 됩니다.

가장 효율적인 UDF는 무엇입니까?

UDF는 코드 실행에 상당한 처리 병목 상태를 유발할 수 있습니다. Azure Databricks는 포함된 Apache Spark, SQL 및 Delta Lake 구문으로 작성된 코드에 다양한 최적화 도구를 자동으로 사용합니다. UDF에 사용자 지정 논리가 도입되면 이러한 최적화 프로그램은 이 사용자 지정 논리를 중심으로 작업을 효율적으로 계획할 능력이 없습니다. 또한 JVM 외부에서 실행되는 논리는 데이터 serialization과 관련된 추가 비용이 발생합니다.

참고 항목

Azure Databricks는 Photon 사용 컴퓨팅을 사용하는 경우 Photon을 사용하여 많은 함수를 최적화합니다. DataFrame 명령의 Spark SQL을 연결하는 함수만 Photon에서 최적화할 수 있습니다.

일부 UDF는 다른 UDF보다 더 효율적입니다. 성능 측면에서 다음과 같은 특징이 있습니다.

  • Azure Databricks 최적화 프로그램 때문에 기본 제공 함수가 가장 빠릅니다.
  • JVM(Scala, Java, Hive UDF)에서 실행되는 코드는 Python UDF보다 빠릅니다.
  • Pandas UDF는 Arrow를 사용하여 Python UDF와 관련된 serialization 비용을 줄입니다.
  • Python UDF는 절차적 논리에 적합하지만 대규모 데이터 세트의 프로덕션 ETL 워크로드에서는 피해야 합니다.

참고 항목

Databricks Runtime 12.2 LTS 이하에서는 공유 액세스 모드를 사용하는 클러스터의 Unity 카탈로그에서 Python 스칼라 UDF 및 Pandas UDF가 지원되지 않습니다. 이러한 UDF는 모든 액세스 모드에 대해 Databricks Runtime 13.3 LTS 이상에서 지원됩니다.

Databricks Runtime 14.1 이하에서는 공유 액세스 모드를 사용하는 클러스터의 Unity 카탈로그에서 Scala 스칼라 UDF가 지원되지 않습니다. 이러한 UDF는 Databricks Runtime 14.2 이상의 모든 액세스 모드에서 지원됩니다.

Databricks Runtime 13.3 LTS 이상에서는 SQL 구문을 사용하여 Unity 카탈로그에 스칼라 Python UDF를 등록할 수 있습니다. Unity 카탈로그의 UDF(사용자 정의 함수)를 참조 하세요.

Type 최적화됨 실행 환경
Hive UDF 아니요 JVM
Python UDF 아니요 Python
Pandas UDF 아니요 Python(Arrow)
Scala UDF 아니요 JVM
Spark SQL JVM(Photon)
Spark DataFrame JVM(Photon)

UDF는 언제 사용해야 하나요?

UDF의 주요 이점은 사용자가 친숙한 언어로 논리를 표현할 수 있으므로 코드 리팩터링과 관련된 인적 비용을 줄일 수 있다는 것입니다. 임시 쿼리, 수동 데이터 정리, 예비 데이터 분석, 중소 규모의 데이터 세트에 대한 대부분의 작업에서는 UDF와 관련된 대기 시간 오버헤드 비용이 리팩터링 코드 관련 비용보다 클 가능성이 낮습니다.

ETL 작업, 스트리밍 작업, 대규모 데이터 세트에 대한 작업, 정기적으로 또는 지속적으로 실행되는 다른 워크로드의 경우 네이티브 Apache Spark 메서드를 사용하도록 논리를 리팩터링하면 신속하게 이득을 볼 수 있습니다.

예제 UDF의 예시 데이터

이 문서의 코드 예제에서는 UDF를 사용하여 온도를 섭씨와 화씨 간에 변환합니다. 이러한 함수를 실행하려면 다음 Python 코드를 사용하여 샘플 데이터 세트를 만들면 됩니다.

import numpy as np
import pandas as pd

Fdf = pd.DataFrame(np.random.normal(55, 25, 10000000), columns=["temp"])
Fdf["unit"] = "F"

Cdf = pd.DataFrame(np.random.normal(10, 10, 10000000), columns=["temp"])
Cdf["unit"] = "C"

df = spark.createDataFrame(pd.concat([Fdf, Cdf]).sample(frac=1))

df.cache().count()
df.createOrReplaceTempView("tv_temp")