Narzędzia notebookUtils User Data Function (UDF) dla Fabric

Moduł notebookutils.udf udostępnia narzędzia do integrowania kodu notesu z elementami funkcji UDF (User Data Function). Dostęp do funkcji można uzyskać z elementu UDF w tym samym obszarze roboczym lub w różnych obszarach roboczych, a następnie wywołać te funkcje w razie potrzeby. Elementy funkcji UDF promują możliwość ponownego obsługi kodu, scentralizowaną konserwację i współpracę zespołową.

Użyj narzędzi UDF, aby:

  • Pobieranie funkcji — uzyskiwanie dostępu do funkcji z elementów UDF według nazwy.
  • Dostęp między obszarami roboczymi — używaj funkcji z elementów UDF w innych obszarach roboczych.
  • Odnajdywanie funkcji — sprawdzanie dostępnych funkcji i ich podpisów.
  • Elastyczne wywołanie — wywoływanie funkcji przy użyciu parametrów odpowiednich dla języka.

Uwaga / Notatka

Aby pobrać jego funkcje, musisz mieć dostęp do odczytu do elementu UDF w docelowym obszarze roboczym. Wyjątki od funkcji UDF są propagowane do notatnika wywołującego.

W poniższej tabeli wymieniono dostępne metody funkcji zdefiniowanej przez użytkownika:

Metoda Signature Opis
getFunctions getFunctions(udf: String, workspaceId: String = ""): UDF Pobiera wszystkie funkcje z elementu UDF według identyfikatora artefaktu lub nazwy. Zwraca obiekt z atrybutami funkcji z możliwością wywołania.

Zwrócony obiekt uwidacznia następujące właściwości:

Majątek Typ Opis
functionDetails List Lista słowników metadanych funkcji. Każdy słownik zawiera: Name (nazwa funkcji), Description (opis funkcji), (listę definicji parametrów), ParametersFunctionReturnType (typ zwracany) i DataSourceConnections (używane połączenia ze źródłem danych).
itemDetails Słownik Słownik metadanych elementu UDF z kluczami: Id (identyfikator artefaktu), Name (nazwa elementu), WorkspaceId (identyfikator obszaru roboczego) i CapacityId (identyfikator pojemności).
<functionName> Callable Każda funkcja w elemencie UDF staje się metodą wywoływaną dla zwróconego obiektu. Użyj polecenia myFunctions.functionName(...) , aby wywołać polecenie .

Tip

Pobierz funkcje UDF jednorazowo i buforuj obiekt opakowujący. Unikaj wielokrotnego wywoływania getFunctions() w pętli — buforuj wynik zamiast tego, aby zminimalizować obciążenie.

Pobieranie funkcji z UDF (user-defined function)

Użyj polecenia notebookutils.udf.getFunctions() , aby pobrać wszystkie funkcje z elementu UDF. Opcjonalnie możesz określić identyfikator obszaru roboczego dla dostępu między obszarami roboczymi.

# Get functions from a UDF item in the current workspace
myFunctions = notebookutils.udf.getFunctions('UDFItemName')

# Get functions from a UDF item in another workspace
myFunctions = notebookutils.udf.getFunctions('UDFItemName', 'workspaceId')

Wywoływanie funkcji

Po pobraniu funkcji z elementu UDF wywołaj je według nazwy. Język Python obsługuje parametry pozycyjne i nazwane. Przykłady języka Scala i R używają parametrów pozycyjnych.

# Positional parameters
myFunctions.functionName('value1', 'value2')

# Named parameters (recommended for clarity)
myFunctions.functionName(parameter1='value1', parameter2='value2')

Domyślne wartości parametrów

Fabric funkcje danych użytkownika obsługują domyślne wartości argumentów. Po wywołaniu funkcji pobranych za pomocą notebookutils.udf.getFunctionspolecenia można pominąć dowolny parametr, który ma zdefiniowaną wartość domyślną — środowisko uruchomieniowe automatycznie używa wartości domyślnej. Można również podać nazwane argumenty, aby zastąpić określone wartości domyślne, pozostawiając inne na ich domyślnych ustawieniach.

# Assume the UDF item defines a function like:
# def score_customer(customerId: str, startDate: datetime = "2025-01-01T00:00:00Z", isActive: bool = True, maxRecords: int = 100) -> dict
# The datetime defaults are specified as strings in the signature; the runtime parses them to datetime at invocation time.

# 1. Call without optional parameters — defaults are used for startDate, isActive, and maxRecords
result = myFunctions.scoreCustomer(customerId='C001')

# 2. Override one default via a named argument, keep the others at their defaults
result = myFunctions.scoreCustomer(customerId='C001', maxRecords=50)

# 3. Pass a date/time in ISO 8601 format for reliable parsing
result = myFunctions.scoreCustomer(customerId='C001', startDate='2025-12-31T23:59:59Z')

Obsługiwane domyślne typy danych wejściowych

Następujące typy są obsługiwane jako domyślne wartości parametrów:

Typ domyślny Notes
String Dowolny ciąg z możliwością serializacji JSON.
Ciąg daty/godziny Określ jako ciąg w nagłówku funkcji. Środowisko uruchomieniowe parsuje je do datetime w czasie wywołania. Użyj spójnego formatu, takiego jak ISO 8601 (na przykład 2025-12-31T23:59:59Z).
logiczny True lub False.
Integer Dowolna wartość całkowita.
Pływak Dowolna wartość zmiennoprzecinkowa.
List Musi być serializowalny w formacie JSON; preferuj None w sygnaturze i przypisz wartość wewnątrz definicji funkcji, aby uniknąć pułapek związanych z modyfikowalnymi wartościami domyślnymi.
Słownik Musi być serializowalny w formacie JSON; preferuj użycie None w sygnaturze i przypisz wewnątrz funkcji.
Ramka danych biblioteki pandas Podany jako obiekt JSON, który zestaw SDK konwertuje na typ biblioteki pandas. Wymaga fabric-user-data-functions wersji 1.0.0 lub nowszej.
Pandas Series Podana jako tablica JSON obiektów, które zestaw SDK konwertuje na typ biblioteki pandas. Wymaga fabric-user-data-functions wersji 1.0.0 lub nowszej.

Ograniczenia i wskazówki

Wartości domyślne muszą być serializowalne w formacie JSON (zestawy i krotki nie są obsługiwane). W przypadku domyślnych wartości listy lub słownika użyj None w sygnaturze funkcji i przypisz rzeczywistą wartość domyślną wewnątrz funkcji, aby uniknąć współdzielonych mutowalnych wartości domyślnych. Użyj formatu ISO 8601 (na przykład 2025-12-31T23:59:59Z) dla wartości domyślnych daty/godziny. Używanie ramki danych pandas lub serii jako domyślnych wymaga wersji fabric-user-data-functions 1.0.0 lub nowszej.

Wyświetlanie szczegółów

Metadane elementów UDF i podpisy funkcji można sprawdzić programowo.

Wyświetlanie szczegółów elementu UDF

display(myFunctions.itemDetails)

Wyświetlanie szczegółów funkcji

display(myFunctions.functionDetails)

Tip

Zawsze sprawdzaj functionDetails podczas pracy z nowym elementem funkcji zdefiniowanej przez użytkownika. Ułatwia to zweryfikowanie dostępnych funkcji i ich oczekiwanych typów parametrów przed wywołaniem.

Obsługa błędów

Opakuj wywołania funkcji definiowanych przez użytkownika w obsługę błędów odpowiednią dla języka, aby bezproblemowo zarządzać brakującymi funkcjami lub nieoczekiwanymi typami parametrów. Przed wywołaniem funkcji należy zawsze sprawdzić, czy funkcja istnieje w elemencie UDF.

import json

try:
    validators = notebookutils.udf.getFunctions('DataValidators')

    # Check if function exists before calling
    functions_info = json.loads(validators.functionDetails)
    function_names = [f['Name'] for f in functions_info]

    if 'validateSchema' in function_names:
        is_valid = validators.validateSchema(
            schema='sales_schema',
            data_path='Files/data/sales.csv'
        )
        print(f"Schema validation: {'passed' if is_valid else 'failed'}")
    else:
        print("validateSchema function not available in this UDF item")
        print(f"Available functions: {', '.join(function_names)}")

except AttributeError as e:
    print(f"Function not found: {e}")
except TypeError as e:
    print(f"Parameter type mismatch: {e}")
except Exception as e:
    print(f"Error invoking UDF: {e}")

Używanie funkcji UDF w potoku danych

Możesz komponować funkcje UDF, aby tworzyć wielokrotnego użytku kroki ETL.

etl_functions = notebookutils.udf.getFunctions('ETLUtilities')

df = spark.read.csv('Files/raw/sales.csv', header=True)
cleaned_df = etl_functions.removeOutliers(df, columns=['amount'])
enriched_df = etl_functions.addCalculatedColumns(cleaned_df)
validated_df = etl_functions.validateAndFilter(enriched_df)

validated_df.write.mode('overwrite').parquet('Files/processed/sales.parquet')
print("ETL pipeline completed using UDF functions")

Ważna

Wywołania funkcji UDF mają narzut. Jeśli wielokrotnie wywołujesz tę samą funkcję z tymi samymi parametrami, rozważ buforowanie wyniku. Unikaj wywoływania funkcji UDF w ciasnych pętlach, jeśli to możliwe.