Dela via


Användardefinierade funktioner (UDF: er) i Unity Catalog

Viktigt!

Den här funktionen finns som allmänt tillgänglig förhandsversion.

Azure Databricks innehåller en SQL-inbyggd syntax för att registrera anpassade funktioner i scheman som styrs av Unity Catalog. Python-UDF:er som är registrerade som funktioner i Unity Catalog skiljer sig åt i omfattning och stöd från PySpark-UDF:er som är begränsade till en notebook-fil eller SparkSession. Se Användardefinierade skalärfunktioner – Python.

Den fullständiga SQL-språkreferensen finns i CREATE FUNCTION (SQL och Python).

Information om hur Unity Catalog hanterar behörigheter för funktioner finns i SKAPA FUNKTION.

Krav

  • Databricks Runtime 13.3 LTS eller senare.
  • Om du vill använda Python-kod i UDF:er som är registrerade i Unity Catalog måste du använda ett serverlöst eller pro SQL-lager eller ett kluster som kör Databricks Runtime 13.3 LTS eller senare.
  • För att lösa vyer som har skapats med hjälp av en UDF som är registrerad i Unity Catalog måste du använda ett serverlöst eller pro SQL-lager.

Anpassade SQL-funktioner i Unity Catalog

När du skapar en SQL-funktion med hjälp av beräkning som konfigurerats för Unity Catalog registreras funktionen som standard i det aktiva schemat. I följande exempel visas den syntax som du kan använda för att deklarera en målkatalog och ett schema för en ny funktion:

CREATE FUNCTION target_catalog.target_schema.roll_dice()
    RETURNS INT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a single 6 sided die'
    RETURN (rand() * 6)::INT + 1;

Alla användare med tillräcklig behörighet för funktionen kan sedan använda funktionen i beräkningsmiljöer som konfigurerats för Unity Catalog, som i följande exempel:

SELECT target_catalog.target_schema.roll_dice()

Kommentar

Du kan använda UDF:er med LANGUAGE SQL för att returnera tabeller eller skalära värden.

Registrera en Python UDF till Unity Catalog

I Databricks Runtime 13.3 LTS och senare kan du använda SQL-instruktionen CREATE FUNCTION för att registrera skalära Python-UDF:er till Unity Catalog.

Viktigt!

Om du vill använda ett SQL-lager för att registrera Python-UDF:er i Unity Catalog måste det vara ett Pro- eller Serverlöst SQL-lager.

Python-UDF:er är utformade för att ge fullständig uttrycksfullhet i Python direkt i SQL-funktioner, vilket möjliggör anpassade åtgärder som avancerade transformeringar, datamaskering och hashning.

Python-UDF:er körs i en säker, isolerad miljö och har inte åtkomst till filsystem eller interna tjänster.

I Databricks Runtime 13.3 LTS till 14.2 tillåter Python-UDF:er som körs på serverlös beräkning eller i läget för delad åtkomst TCP/UDP-nätverkstrafik via portarna 80, 443 och 53.

Se Vilka UDF:er är mest effektiva?.

Kommentar

Syntax och semantik för Python-UDF:er i Unity Catalog skiljer sig från Python-UDF:er som är registrerade i SparkSession. Se Användardefinierade skalärfunktioner – Python.

Python UDF:er för Unity Catalog använder instruktioner som anges med dubbla dollartecken ($$), som i följande kodexempel:

CREATE FUNCTION target_catalog.target_schema.greet(s STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
  return f"Hello, {s}"
$$

I följande exempel visas hur du använder den här funktionen för att returnera hälsningsuttryck för alla namn som lagras i kolumnen i first_name en tabell med namnet students:

SELECT target_catalog.target_schema.greet(first_name)
FROM students;

Du kan definiera valfritt antal Python-funktioner i en Python UDF, men måste returnera ett skalärt värde.

Python-funktioner måste hantera NULL värden oberoende av varandra, och alla typmappningar måste följa Azure Databricks SQL-språkmappningar.

Du kan importera python-standardbibliotek som ingår i Azure Databricks, men du kan inte inkludera anpassade bibliotek eller externa beroenden.

Om ingen katalog eller schema har angetts registreras Python-UDF:er i det aktuella aktiva schemat.

I följande exempel importeras ett bibliotek och flera funktioner används i en Python UDF:

CREATE FUNCTION roll_dice(num_dice INTEGER, num_sides INTEGER)
RETURNS INTEGER
LANGUAGE PYTHON
AS $$
  import numpy as np

  def roll_die(num_sides):
    return np.random.randint(num_sides) + 1

  def sum_dice(num_dice,num_sides):
    return sum([roll_die(num_sides) for x in range(num_dice)])

  return sum_dice(num_dice, num_sides)
$$