Delen via


Wat zijn door de gebruiker gedefinieerde functies (UDF's)?

Een door de gebruiker gedefinieerde functie (UDF) is een functie die door een gebruiker is gedefinieerd, zodat aangepaste logica opnieuw kan worden gebruikt in de gebruikersomgeving. Azure Databricks biedt ondersteuning voor veel verschillende typen UDF's om uitbreidbare logica te kunnen distribueren. In dit artikel worden enkele algemene sterke punten en beperkingen van UDF's geïntroduceerd.

Notitie

Niet alle vormen van UDF's zijn beschikbaar in alle uitvoeringsomgevingen in Azure Databricks. Als u met Unity Catalog werkt, raadpleegt u door de gebruiker gedefinieerde functies (UDF's) in Unity Catalog.

Zie de volgende artikelen voor meer informatie over UDF's:

Aangepaste logica definiëren zonder serialisatiestraffen

Azure Databricks neemt veel van het UDF-gedrag over van Apache Spark, inclusief de efficiëntiebeperkingen voor veel soorten UDF's. Zie welke UDF's het efficiëntst zijn?

U kunt uw code veilig modulariseren zonder dat u zich zorgen hoeft te maken over mogelijke efficiëntie-compromissen die zijn gekoppeld aan UDF's. Hiervoor moet u uw logica definiëren als een reeks ingebouwde Spark-methoden met behulp van SQL of Spark DataFrames. De volgende SQL- en Python-functies combineren bijvoorbeeld ingebouwde Spark-methoden om een eenheidsconversie te definiëren als herbruikbare functie:

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)

Als u de bovenstaande UDF's wilt uitvoeren, kunt u voorbeeldgegevens maken.

Welke UDF's zijn het efficiëntst?

UDF's kunnen aanzienlijke verwerkingsknelpunten veroorzaken bij het uitvoeren van code. Azure Databricks maakt automatisch gebruik van een aantal verschillende optimalisatiefuncties voor code die is geschreven met de syntaxis van Apache Spark, SQL en Delta Lake. Wanneer aangepaste logica wordt geïntroduceerd door UDF's, hebben deze optimalisaties niet de mogelijkheid om taken efficiënt te plannen rond deze aangepaste logica. Bovendien heeft logica die buiten de JVM wordt uitgevoerd extra kosten met betrekking tot gegevensserialisatie.

Notitie

Azure Databricks optimaliseert veel functies met Behulp van Photon als u rekenkracht met Photon gebruikt. Alleen functies die aan Spark SQL van DataFrame-opdrachten zijn gekoppeld, kunnen worden geoptimaliseerd door Photon.

Sommige UDF's zijn efficiënter dan andere. Wat betreft prestaties:

  • Ingebouwde functies zijn het snelst vanwege Azure Databricks-optimalisaties.
  • Code die wordt uitgevoerd in de JVM (Scala, Java, Hive UDF's) is sneller dan Python UDF's.
  • Pandas UDF's gebruiken Arrow om serialisatiekosten te verlagen die zijn gekoppeld aan Python UDF's.
  • Python UDF's werken goed voor procedurelogica, maar moeten worden vermeden voor productie-ETL-workloads op grote gegevenssets.

Notitie

In Databricks Runtime 12.2 LTS en hieronder worden Scalaire UDF's en Pandas UDF's niet ondersteund in Unity Catalog op clusters die gebruikmaken van de modus voor gedeelde toegang. Deze UDF's worden ondersteund in Databricks Runtime 13.3 LTS en hoger voor alle toegangsmodi.

In Databricks Runtime 14.1 en lager worden Scalaire UDF's niet ondersteund in Unity Catalog op clusters die gebruikmaken van de modus voor gedeelde toegang. Deze UDF's worden ondersteund voor alle toegangsmodi in Databricks Runtime 14.2 en hoger.

In Databricks Runtime 13.3 LTS en hoger kunt u scalaire Python UDF's registreren bij Unity Catalog met behulp van SQL-syntaxis. Zie door de gebruiker gedefinieerde functies (UDF's) in Unity Catalog.

Type Geoptimaliseerd Uitvoeringsomgeving
Hive UDF Nee JVM
Python UDF Nee Python
Pandas UDF Nee Python (pijl)
Scala UDF Nee JVM
Spark SQL Ja JVM (Photon)
Spark DataFrame Ja JVM (Photon)

Wanneer moet u een UDF gebruiken?

Een belangrijk voordeel van UDF's is dat gebruikers logica in vertrouwde talen kunnen uitdrukken, waardoor de menselijke kosten voor herstructureringscode worden verminderd. Voor ad-hocquery's, handmatige gegevensopschoning, verkennende gegevensanalyse en de meeste bewerkingen op kleine of middelgrote gegevenssets zijn de overheadkosten voor latentie die zijn gekoppeld aan UDF's waarschijnlijk niet opwegen tegen kosten die zijn gekoppeld aan herstructureringscode.

Voor ETL-taken, streamingbewerkingen, bewerkingen op zeer grote gegevenssets of andere workloads die regelmatig of continu worden uitgevoerd, herstructureringslogica voor het gebruik van systeemeigen Apache Spark-methoden betaalt snel dividenden.

Voorbeeldgegevens, bijvoorbeeld UDF's

In de codevoorbeelden in dit artikel worden UDF's gebruikt om temperaturen tussen Celcius en Farenheit te converteren. Als u deze functies wilt uitvoeren, kunt u een voorbeeldgegevensset maken met de volgende Python-code:

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