Sdílet prostřednictvím


Co jsou uživatelem definované funkce (UDF)?

Uživatelem definovaná funkce (UDF) je funkce definovaná uživatelem, která umožňuje opakované použití vlastní logiky v uživatelském prostředí. Azure Databricks podporuje mnoho různých typů funkcí definovaných uživatelem, aby bylo možné distribuovat rozšiřitelnou logiku. Tento článek představuje některé obecné silné stránky a omezení funkcí definovaných uživatelem.

Poznámka:

Ne všechny formy funkcí definované uživatelem jsou dostupné ve všech spouštěcích prostředích v Azure Databricks. Pokud pracujete s katalogem Unity, přečtěte si téma Uživatelem definované funkce (UDF) v katalogu Unity.

Definování vlastní logiky bez sankcí serializace

Azure Databricks dědí většinu svého chování uživatelem z Apache Sparku, včetně omezení efektivity řady typů definovaných uživatelem. Podívejte se, které funkce definované uživatelem jsou nejúčinnější?

Kód můžete bezpečně modularizovat, aniž byste se museli starat o potenciální kompromisy proti efektivitě spojené s definovanými funkcemi definované uživatelem. K tomu je potřeba definovat logiku jako řadu předdefinovaných metod Sparku pomocí datových rámců SQL nebo Spark. Například následující funkce SQL a Pythonu kombinují integrované metody Sparku, které definují převod jednotek jako opakovaně použitelnou funkci:

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)

Pokud chcete spustit výše uvedené funkce definované uživatelem, můžete vytvořit ukázková data.

Které funkce definované uživatelem jsou nejúčinnější?

Funkce definované uživatelem můžou do spouštění kódu zavádět významné kritické body zpracování. Azure Databricks používá několik různých optimalizátorů automaticky pro kód napsaný pomocí zahrnuté syntaxe Apache Sparku, SQL a Delta Lake. Pokud vlastní logiku zavádí funkce definovaná uživatelem, nemají tyto optimalizátory možnost efektivně plánovat úlohy kolem této vlastní logiky. Kromě toho logika, která se spouští mimo JVM, má další náklady na serializaci dat.

Poznámka:

Azure Databricks optimalizuje mnoho funkcí pomocí Photonu, pokud používáte výpočetní prostředky s podporou Photon. Photon může optimalizovat jenom funkce, které zřetězí spark SQL příkazů datového rámce.

Některé funkce definované uživatelem jsou efektivnější než jiné. Z hlediska výkonu:

  • Integrované funkce budou nejrychlejší kvůli optimalizátorům Azure Databricks.
  • Kód, který se spouští v prostředí JVM (Scala, Java, Hive UDF), bude rychlejší než uživatelem definované uživatelem Pythonu.
  • Funkce Definované uživatelem pandas používají šipku ke snížení nákladů na serializaci spojených s uživatelem definovanými uživatelem Pythonu.
  • Definované funkce Pythonu dobře fungují pro procedurální logiku, ale měly by se vyhnout produkčním úlohám ETL u velkých datových sad.

Poznámka:

Ve službě Databricks Runtime 12.2 LTS a níže nejsou skalární uživatelem definované soubory Pythonu a uživatelem definované uživatelem pandas podporovány v katalogu Unity v clusterech, které používají režim sdíleného přístupu. Tyto funkce definované uživatelem jsou podporovány ve službě Databricks Runtime 13.3 LTS a vyšší pro všechny režimy přístupu.

Ve službě Databricks Runtime 14.1 a novějších nejsou skalární uživatelem scala podporované v katalogu Unity v clusterech, které používají režim sdíleného přístupu. Tyto funkce definované uživatelem jsou podporovány pro všechny režimy přístupu v Databricks Runtime 14.2 a vyšší.

Ve službě Databricks Runtime 13.3 LTS a novějších můžete pomocí syntaxe SQL zaregistrovat skalární uživatelem definované uživatelem Pythonu do katalogu Unity. Viz uživatelem definované funkce (UDF) v katalogu Unity.

Typ Optimalizované Spouštěcí prostředí
Definované uživatelem Hivu No JVM
Uživatelem definovaná funkce Pythonu No Python
Pandas UDF No Python (šipka)
Scala UDF No JVM
Spark SQL Ano JVM (Photon)
Datový rámec Sparku Ano JVM (Photon)

Kdy byste měli použít funkci definovanou uživatelem?

Hlavní výhodou funkcí definovaných uživatelem je, že umožňují uživatelům vyjádřit logiku ve známých jazycích, což snižuje lidské náklady spojené s refaktoringovým kódem. U ad hoc dotazů, ručního čištění dat, průzkumné analýzy dat a většiny operací s malými nebo středními datovými sadami se náklady na režii latence spojené s UDF pravděpodobně nepřeváží náklady spojené s refaktoringovým kódem.

U úloh ETL, operací streamování, operací s velmi velkými datovými sadami nebo jinými úlohami, které se provádějí pravidelně nebo nepřetržitě, refaktoring logiky pro použití nativních metod Apache Sparku rychle platí dividendy.

Příklad dat pro uživatelem definované uživatelem

Příklady kódu v tomto článku používají funkce definované uživatelem k převodu teplot mezi celciusem a Farenheitem. Pokud chcete tyto funkce spustit, můžete vytvořit ukázkovou datovou sadu s následujícím kódem Pythonu:

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")