Felhasználó által definiált függvények (UDF-ek) a Unity Katalógusban
Fontos
Ez a funkció a nyilvános előzetes verzióban érhető el.
A Unity Catalog felhasználó által definiált függvényei (UDF-ek) kibővítik az SQL és a Python képességeit az Azure Databricksben. Lehetővé teszik az egyéni függvények meghatározását, használatát, biztonságos megosztását és szabályozását a számítási környezetekben.
A Unity-katalógusban függvényként regisztrált Python UDF-ek hatóköre és támogatása eltér a pySpark UDF-ektől a jegyzetfüzetig vagy a SparkSessionig. Lásd: Felhasználó által definiált skaláris függvények – Python.
A teljes SQL-nyelvi referenciaért tekintse meg a CREATE FÜGGVÉNYt (SQL és Python).
Követelmények
Az UDF-ek Unity Catalogban való használatához a következő követelményeknek kell teljesülniük:
- A Unity Catalogban regisztrált UDF-ekben használt Python-kód használatához kiszolgáló nélküli vagy pro SQL-tárolót vagy Databricks Runtime 13.3 LTS-t vagy újabb verziót futtató fürtöt kell használnia.
- Ha egy nézet tartalmaz egy UC Python UDF-et, az a klasszikus SQL-tárolókon sikertelen lesz.
UDF-ek létrehozása a Unity Katalógusban
Az UDF Unity-katalógusban való létrehozásához a felhasználóknak HASZNÁLATI és LÉTREHOZÁSi engedélyre van szükségük a katalógus sémájára és HASZNÁLATI engedélyére. További részletekért tekintse meg a Unity katalógusát .
Egy UDF futtatásához a felhasználóknak végrehajtási engedélyre van szükségük az UDF-en. A felhasználóknak használati engedélyre is szükségük van a sémához és a katalógushoz.
Az alábbi példa egy új függvényt regisztrál a my_schema
Unity Catalog sémába:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi(weight DOUBLE, height DOUBLE)
RETURNS DOUBLE
LANGUAGE SQL
AS
SELECT weight / (height * height);
A Unity Catalog pythonos UDF-jei dupla dollárjelekkel ($$) eltolt utasításokat használnak. Meg kell adnia egy adattípus-leképezést is. Az alábbi példa egy olyan UDF-t regisztrál, amely kiszámítja a testtömegindexet:
CREATE FUNCTION my_catalog.my_schema.calculate_bmi(weight_kg DOUBLE, height_m DOUBLE)
RETURNS DOUBLE
LANGUAGE PYTHON
AS $$
return weight_kg / (height_m ** 2)
$$;
Most már használhatja ezt a Unity Catalog függvényt az SQL-lekérdezésekben vagy a PySpark-kódban:
SELECT person_id, my_catalog.my_schema.calculate_bmi(weight_kg, height_m) AS bmi
FROM person_data;
A Unity Catalog UDF használata a PySparkban
from pyspark.sql.functions import expr
result = df.withColumn("bmi", expr("my_catalog.my_schema.calculate_bmi(weight_kg, height_m)"))
display(result)
Munkamenet-hatókörű UDF frissítése
Feljegyzés
A Unity Catalog pythonos UDF-jeinek szintaxisa és szemantikája eltér a SparkSession-ben regisztrált Python UDF-ektől. Lásd: felhasználó által definiált skaláris függvények – Python.
Egy Azure Databricks-jegyzetfüzetben a következő munkamenet-alapú UDF-et használja:
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
@udf(StringType())
def greet(name):
return f"Hello, {name}!"
# Using the session-based UDF
result = df.withColumn("greeting", greet("name"))
result.show()
Ha ezt Unity Catalog-függvényként szeretné regisztrálni, használjon egy SQL-utasítást CREATE FUNCTION
, ahogyan az alábbi példában is látható:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.greet(name STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
return f"Hello, {name}!"
$$
UDF-ek megosztása a Unity Katalógusban
Az UDF-ek engedélyeinek kezelése a katalógusra, sémára vagy adatbázisra alkalmazott hozzáférés-vezérlők alapján történik, ahol az UDF regisztrálva van. További információt a Unity katalógusában talál.
Az Azure Databricks SQL vagy az Azure Databricks-munkaterület felhasználói felületének használatával adjon engedélyeket egy felhasználónak vagy csoportnak (ajánlott).
Engedélyek a munkaterület felhasználói felületén
- Keresse meg azt a katalógust és sémát, amelyben az UDF van tárolva, és válassza ki az UDF-et.
- Keresse meg az Engedélyek lehetőséget az UDF beállításai között. Adjon hozzá felhasználókat vagy csoportokat, és adja meg a hozzáférés típusát, például az EXECUTE vagy a MANAGE lehetőséget.
! [Engedélyek a munkaterület felhasználói felületén](.. /_static/images/udf/high res udf permission.gif)
Engedélyek az Azure Databricks SQL használatával
Az alábbi példa az EXECUTE engedélyt ad a felhasználónak egy függvényen:
GRANT EXECUTE ON FUNCTION my_catalog.my_schema.calculate_bmi TO user@example.com;
Az engedélyek eltávolításához használja a parancsot az REVOKE
alábbi példához hasonlóan:
REVOKE EXECUTE ON FUNCTION my_catalog.my_schema.calculate_bmi FROM user@example.com;
Ajánlott eljárások az UDF-ekhez
Azoknak az UDF-eknek, amelyeknek minden felhasználó számára elérhetőnek kell lenniük, a Databricks azt javasolja, hogy hozzon létre egy dedikált katalógust és sémát a megfelelő hozzáférés-vezérléssel.
Csapatspecifikus UDF-ekhez használjon egy dedikált sémát a csapat katalógusában a tároláshoz és a felügyelethez.
Az Azure Databricks a következő információkat javasolja a UDF dokumentációjában:
- Az aktuális verziószám
- Változásnapló a verziók módosításainak nyomon követéséhez
- Az UDF célja, paraméterei és visszatérési értéke
- Példa az UDF használatára
Íme egy példa egy UDF-re, amely az alábbi ajánlott eljárásokat követi:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi(weight_kg DOUBLE, height_m DOUBLE)
RETURNS DOUBLE
COMMENT ”Calculates Body Mass Index (BMI) from weight and height.”
LANGUAGE PYTHON
AS $$
"""
Parameters:
calculate_bmi (version 1.2):
- weight_kg (float): Weight of the individual in kilograms.
- height_m (float): Height of the individual in meters.
Returns:
- float: The calculated BMI.
Example Usage:
SELECT calculate_bmi(weight, height) AS bmi FROM person_data;
Change Log:
- 1.0: Initial version.
- 1.1: Improved error handling for zero or negative height values.
- 1.2: Optimized calculation for performance.
Note: BMI is calculated as weight in kilograms divided by the square of height in meters.
"""
if height_m <= 0:
return None # Avoid division by zero and ensure height is positive
return weight_kg / (height_m ** 2)
$$;
UDF-ek külső API-k eléréséhez
Az UDF-ekkel külső API-kat érhet el az SQL-ből. Az alábbi példa a Python-kódtár requests
használatával hoz létre HTTP-kérést.
Feljegyzés
A Python UDF-ek lehetővé teszik a TCP/UDP hálózati forgalmat a 80-as, a 443-as és az 53-as porton a megosztott hozzáférési móddal konfigurált kiszolgáló nélküli számítással vagy számítással.
CREATE FUNCTION my_catalog.my_schema.get_food_calories(food_name STRING)
RETURNS DOUBLE
LANGUAGE PYTHON
AS $$
import requests
api_url = f"https://example-food-api.com/nutrition?food={food_name}"
response = requests.get(api_url)
if response.status_code == 200:
data = response.json()
# Assuming the API returns a JSON object with a 'calories' field
calories = data.get('calories', 0)
return calories
else:
return None # API request failed
$$;
UDF-ek a biztonsághoz és a megfelelőséghez
Egyéni jogkivonatok, adatmaszkolás, adatátfedés vagy titkosítási mechanizmusok implementálása Python UDF-ekkel.
Az alábbi példa elfedi egy e-mail-cím identitását a hossz és a tartomány megőrzése mellett:
CREATE OR REPLACE FUNCTION my_catalog.my_schema.mask_email(email STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
parts = email.split('@')
masked_username = username[0] + '*' * (len(username) - 2) + username[-1]
return f"{masked_username}@{domain}"
$$
Az alábbi példa ezt az UDF-et egy dinamikus nézetdefinícióban alkalmazza:
-- First, create the view
CREATE OR REPLACE VIEW my_catalog.my_schema.masked_customer_view AS
SELECT
id,
name,
my_catalog.my_schema.mask_email(email) AS email
FROM my_catalog.my_schema.customer_data;
-- Now you can query the view
SELECT * FROM my_catalog.my_schema.masked_customer_view;
+---+------------+------------------------+------------------------+
| id| name| email| masked_email |
+---+------------+------------------------+------------------------+
| 1| John Doe| john.doe@example.com | j*******e@example.com |
| 2| Alice Smith|alice.smith@company.com |a**********h@company.com|
| 3| Bob Jones| bob.jones@email.org | b********s@email.org |
+---+------------+------------------------+------------------------+
Korlátozások
- A Python UDF-ben tetszőleges számú Python-függvényt definiálhat, de mindegyiknek skaláris értéket kell visszaadnia.
- A Python-függvényeknek egymástól függetlenül kell kezelnie a NULL értékeket, és minden típusleképezésnek követnie kell az Azure Databricks SQL nyelvi leképezéseit.
- Az Azure Databricks által tartalmazott standard Python-kódtárakat importálhatja, de egyéni kódtárakat vagy külső függőségeket nem.
- Ha nincs megadva katalógus vagy séma, a Python UDF-ek regisztrálva lesznek az aktuális aktív sémában.
- A Python UDF-ek biztonságos, elkülönített környezetben futnak, és nem rendelkeznek hozzáféréssel a fájlrendszerekhez vagy a belső szolgáltatásokhoz.