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