Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Batch Unity Catalog Python UDF-ek általában elérhetők. Adatkötegeken működnek, nem pedig egyszerre egy-egy soron.
Követelmények
Klasszikus számítástechnikán a Batch Unity Catalog Python UDF-ekhez Databricks Runtime 16.3 vagy annál magasabb verzió szükséges. Ezek a szerver nélküli számítási környezetben, valamint a pro és a szerver nélküli SQL-adattárházakban is támogatottak.
További képességeknek saját számítási és verziós követelményei vannak. Lásd a Python UDF funkciókövetelményeket.
Hozzon létre egy batch Unity Catalog Python UDF
Egy Batch Unity Catalog Python UDF létrehozása hasonló egy normál Unity Catalog UDF létrehozásához, az alábbi kiegészítésekkel:
-
PARAMETER STYLE PANDAS: Ez azt határozza meg, hogy a UDF a pandas iterátorokkal dolgozza fel a kötegekben lévő adatokat. -
HANDLER 'handler_function': Ez megadja a kezelő függvényt, amely a köteteket feldolgozza.
A következő példa egy tartós Batch Python UDF-et hoz létre a Unity Catalogban. Cseréld my_catalog le a katalógusoddal my_schema és a sémáddal:
%sql
CREATE OR REPLACE FUNCTION my_catalog.my_schema.calculate_bmi_pandas(weight_kg DOUBLE, height_m DOUBLE)
RETURNS DOUBLE
LANGUAGE PYTHON
DETERMINISTIC
PARAMETER STYLE PANDAS
HANDLER 'handler_function'
AS $$
import pandas as pd
from typing import Iterator, Tuple
def handler_function(batch_iter: Iterator[Tuple[pd.Series, pd.Series]]) -> Iterator[pd.Series]:
for weight_series, height_series in batch_iter:
yield weight_series / (height_series ** 2)
$$;
A UDF regisztrálása után SQL-t vagy Python-t használva hívhatja meg.
SELECT person_id, my_catalog.my_schema.calculate_bmi_pandas(weight_kg, height_m) AS bmi
FROM (
SELECT 1 AS person_id, CAST(70.0 AS DOUBLE) AS weight_kg, CAST(1.75 AS DOUBLE) AS height_m UNION ALL
SELECT 2 AS person_id, CAST(80.0 AS DOUBLE) AS weight_kg, CAST(1.80 AS DOUBLE) AS height_m
);
Batch UDF kezelőfüggvény
A Batch Unity Catalog Python UDF-ekhez egy kezelőfüggvény szükséges, amely feldolgozza a csomagokat és eredményeket ad vissza. Az UDF létrehozásakor a HANDLER záradék használatával meg kell adnia a kezelőfüggvény nevét.
A kezelő függvény a következőket hajtja végre:
- Elfogad egy iterátorargumentumot, amely egy vagy több
pandas.Serieselemen iterál. Mindenpandas.Seriestartalmazza a UDF bemeneti paramétereit. - Végigiterál a generátoron és feldolgozza az adatokat.
- Visszaad egy generátor iterátort.
A Batch Unity Catalog Python UDF-eknek ugyanannyi sort kell visszaadniuk, mint amennyi a bemenet. A kezelőfüggvény ezt úgy biztosítja, hogy pandas.Series-t ad vissza, amely ugyanakkora hosszúságú, mint a bemeneti sorozatok minden egyes köteg esetében.
Egyéni függőségek telepítése
A Batch Unity Catalog Python UDF-k funkcionalitását kibővítheti a Databricks Runtime környezetén kívül is azzal, hogy egyedi függőségeket definiál az külső könyvtárakhoz.
Lásd: UDF-ek kiterjesztése egyéni függőségekkel.
Hozzáférés Unity katalógus titkaihoz
Batch Unity Catalog Python UDF-ek hozzáférhetnek a záradékban bejelentett SECRETS titkokhoz. A(z) environment_version értékét kifejezetten 6 vagy annál magasabb értékre kell állítani. Egy ilyen záradékot használó UDF közvetlen meghívása nem támogatott dedikált hozzáférési módú számítási rendszeren. Az oszlopmaszk kivétel esetén lásd: Titkos engedélyezett UDF-eket használunk oszlopmaszkokban dedikált számításon.
A Batch UDF-k elfogadhatnak egy vagy több paramétert
Egyetlen paraméter: Ha a kezelő függvény egyetlen bemeneti paramétert használ, minden tételhez egy iterátort kap az a pandas.Series felett.
%sql
CREATE OR REPLACE TEMPORARY FUNCTION one_parameter_udf(value INT)
RETURNS STRING
LANGUAGE PYTHON
DETERMINISTIC
PARAMETER STYLE PANDAS
HANDLER 'handler_func'
AS $$
import pandas as pd
from typing import Iterator
def handler_func(batch_iter: Iterator[pd.Series]) -> Iterator[pd.Series]:
for value_batch in batch_iter:
d = {"min": value_batch.min(), "max": value_batch.max()}
yield pd.Series([str(d)] * len(value_batch))
$$;
SELECT one_parameter_udf(id), count(*) from range(0, 100000, 3, 8) GROUP BY ALL;
Több paraméter: Több bemeneti paraméter esetén a kezelő függvény egy iterátort kap, amely többször átmegy a pandas.Series-en. Az adatsor értékei ugyanabban a sorrendben vannak, mint a bemeneti paraméterek.
%sql
CREATE OR REPLACE TEMPORARY FUNCTION two_parameter_udf(p1 INT, p2 INT)
RETURNS INT
LANGUAGE PYTHON
DETERMINISTIC
PARAMETER STYLE PANDAS
HANDLER 'handler_function'
AS $$
import pandas as pd
from typing import Iterator, Tuple
def handler_function(batch_iter: Iterator[Tuple[pd.Series, pd.Series]]) -> Iterator[pd.Series]:
for p1, p2 in batch_iter: # same order as arguments above
yield p1 + p2
$$;
SELECT two_parameter_udf(id , id + 1) from range(0, 100000, 3, 8);
Optimalizálja a teljesítményt a költséges műveletek szétválasztásával
A számításigényes műveletek optimalizálását azáltal érheti el, hogy elkülöníti ezeket a műveleteket a kezelő függvénytől. Ez biztosítja, hogy a végrehajtásuk csak egyszer történik, nem pedig minden adatkötegen keresztüli iteráció során.
A következő példa bemutatja, hogyan lehet biztosítani, hogy egy drága számítás csak egyszer történjen meg.
%sql
CREATE OR REPLACE TEMPORARY FUNCTION expensive_computation_udf(value INT)
RETURNS INT
LANGUAGE PYTHON
DETERMINISTIC
PARAMETER STYLE PANDAS
HANDLER 'handler_func'
AS $$
def compute_value():
# expensive computation...
return 1
expensive_value = compute_value()
def handler_func(batch_iter):
for batch in batch_iter:
yield batch * expensive_value
$$;
SELECT expensive_computation_udf(id), count(*) from range(0, 100000, 3, 8) GROUP BY ALL
Környezet elkülönítése
Megjegyzés:
A megosztott elkülönítési környezetekhez a Databricks Runtime 17.1-s vagy újabb verziója szükséges. A korábbi verziókban az összes Batch Unity Catalog Python UDF szigorú elkülönítési módban fut.
Az azonos tulajdonossal és munkamenettel rendelkező Batch Unity Catalog Python UDF-jei alapértelmezés szerint megoszthatnak egy elkülönítési környezetet. Ez javíthatja a teljesítményt és csökkentheti a memóriahasználatot az elindítandó különálló környezetek számának csökkentésével.
Szigorú elkülönítés
Annak érdekében, hogy az UDF mindig a saját, teljesen elkülönített környezetben fusson, adja hozzá a STRICT ISOLATION jellemző záradékot.
A legtöbb UDF-nek nincs szüksége szigorú elkülönítésre. A standard adatfeldolgozási UDF-ek kihasználják az alapértelmezett megosztott elkülönítési környezetet, és gyorsabban futnak alacsonyabb memóriahasználat mellett.
Adja hozzá a STRICT ISOLATION jellemző záradékot az olyan UDF-ekhez, amelyek:
- Bemenet futtatása kódként
eval(),exec()vagy hasonló függvényekkel - Fájlok írása a helyi fájlrendszerbe
- Globális változók vagy rendszerállapot módosítása
- Környezeti változók módosítása
Az alábbi példa egy olyan UDF-t mutat be, amely kódként hajtja végre a bemenetet, és szigorú elkülönítést igényel:
CREATE OR REPLACE TEMPORARY FUNCTION eval_string(input STRING)
RETURNS STRING
LANGUAGE PYTHON
PARAMETER STYLE PANDAS
HANDLER 'handler_func'
STRICT ISOLATION
AS $$
import pandas as pd
from typing import Iterator
def handler_func(batch_iter: Iterator[pd.Series]) -> Iterator[pd.Series]:
for code_series in batch_iter:
def eval_func(code):
try:
return str(eval(code))
except Exception as e:
return f"Error: {e}"
yield code_series.apply(eval_func)
$$;
Szolgáltatás hitelesítő adatai a Batch Unity Catalog Python UDF-jeiben
A Batch Unity Catalog Python UDF-ek Unity Catalog szolgáltatási hitelesítő adatait használhatják külső felhőszolgáltatásokhoz való hozzáféréshez. Ez különösen hasznos a felhőbeli függvények, például a biztonsági tokenizerek adatfeldolgozási munkafolyamatokba való integrálásához.
Megjegyzés:
A szolgáltatás hitelesítő adataihoz tartozó UDF-specifikus API:
Az UDF-ekben használja databricks.service_credentials.getServiceCredentialsProvider() a szolgáltatás hitelesítő adatainak eléréséhez.
Ez eltér a dbutils.credentials.getServiceCredentialsProvider() jegyzetfüzetekben használt függvénytől, amely nem érhető el UDF-végrehajtási környezetekben.
Szolgáltatás hitelesítő adatainak létrehozásáról a Szolgáltatás hitelesítő adatainak létrehozása című témakörben olvashat.
Adja meg az UDF-definíció záradékában CREDENTIALS használni kívánt szolgáltatás-hitelesítő adatokat:
CREATE OR REPLACE TEMPORARY FUNCTION example_udf(data STRING)
RETURNS STRING
LANGUAGE PYTHON
PARAMETER STYLE PANDAS
HANDLER 'handler_function'
CREDENTIALS (
`credential-name` DEFAULT,
`complicated-credential-name` AS short_name,
`simple-cred`,
cred_no_quotes
)
AS $$
# Python code here
$$;
Szolgáltatási hitelesítő adatok jogosultságai
A számítási típusok különböző létrehozási és hívói engedélyigényeiről lásd: Használj szolgáltatási hitelminősítést a Python UDF-ben.
Alapértelmezett hitelesítési adatok és álnevek
Több hitelesítési adatot is beilleszthet a CREDENTIALS záradékba, de csak egyet jelölhet meg DEFAULT. A nem alapértelmezett hitelesítő adatokat álnévvel láthatja el a AS kulcsszó használatával. Minden hitelesítőnek egyedi aliaszal kell rendelkeznie.
A javított felhő SDK-k automatikusan felveszik az alapértelmezett hitelesítő adatokat. Az alapértelmezett hitelesítő adatok elsőbbséget élveznek a számítástechnika Spark konfigurációjában megadott bármely alapértelmezett beállítással szemben, és megmaradnak a Unity Catalog UDF definíciójában.
Ahhoz, hogy használni tudd a azure-identity szolgáltatót, telepítened kell a DefaultAzureCredential csomagot. Használja a ENVIRONMENT záradékot külső könyvtárak telepítéséhez. További információkat az külső könyvtárak telepítéséhez az Egyedi függőségek használatával kiterjesztett UDF-ek oldalon találhat.
Szolgáltatás hitelesítő adatainak példája – Azure Blob Storage
Az alábbi példa szolgáltatás-hitelesítő adatok használatával fér hozzá az Azure Blob Storage-hoz egy Batch Unity Catalog Python UDF-ből:
%sql
CREATE OR REPLACE FUNCTION main.test.read_azure_blob(blob_name STRING) RETURNS STRING LANGUAGE PYTHON
PARAMETER STYLE PANDAS
HANDLER 'batchhandler'
CREDENTIALS (
`batch-udf-service-creds-example-cred` DEFAULT
)
ENVIRONMENT (
dependencies = '["azure-identity", "azure-storage-blob"]', environment_version = 'None'
)
AS $$
import pandas as pd
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
def batchhandler(it):
# DefaultAzureCredential automatically uses the DEFAULT service credential
credential = DefaultAzureCredential()
blob_service = BlobServiceClient(
account_url="https://your-storage-account.blob.core.windows.net",
credential=credential
)
container = blob_service.get_container_client("your-container")
for blob_names in it:
results = []
for name in blob_names:
blob_client = container.get_blob_client(name)
try:
content = blob_client.download_blob().readall().decode("utf-8")
results.append(content)
except Exception as e:
results.append(f"Error: {e}")
yield pd.Series(results)
$$;
Hívja meg az UDF-et, miután regisztrálták.
SELECT main.test.read_azure_blob(blob_name)
FROM VALUES
('config/settings.json'),
('data/input.txt')
AS t(blob_name)
Szerezze meg a feladat végrehajtási kontextust
Használja a TaskContext PySpark API-t a kontextus információk lekéréséhez, például a felhasználóazonosság, a klasztercímkék, a Spark feladat azonosító és további adatok megszerzéséhez. Lásd: Feladat kontextus lekérése egy UDF-ben.
Állítsa be DETERMINISTIC, ha a függvény következetes eredményeket hoz létre.
Adja hozzá DETERMINISTIC a függvénydefinícióhoz, ha ugyanazokat a kimeneteket állítja elő ugyanazokhoz a bemenetekhez. Ez lehetővé teszi a lekérdezésoptimalizálást a teljesítmény javításához.
Alapértelmezés szerint a Batch Unity Catalog Python UDTF-jei nem determinisztikusnak minősülnek, kivéve, ha explicit módon deklarálják. A nem determinisztikus függvények például a következők: véletlenszerű értékek generálása, az aktuális időpontok vagy dátumok elérése, vagy külső API-hívások indítása.
Lásd CREATE FUNCTION : (SQL, Python, Scala és Java)
Korlátozások
- A Python függvényeknek önállóan kell kezelniük a
NULLértékeket, és az összes típusleképezésnek követnie kell az Azure Databricks SQL nyelvi leképezéseit. - Az adagolt Unity Catalog Python UDF-ek biztonságos, elszigetelt környezetben futnak, és nem férnek hozzá megosztott fájlrendszerhez vagy belső szolgáltatásokhoz.
- Egy szakaszon belüli többszörös UDF-hívások sorosítottak, és a közbenső eredmények anyaggá alakítódnak, és esetenként a lemezre kerülhetnek.
- A Batch Unity Catalog Python UDF-hívások kiszolgáló nélküli notebookon vagy feladatszámításon való indításához konfigurálnia kell a kiszolgáló nélküli kimenő forgalom vezérlését