Утилиты NotebookUtils для функции пользовательских данных (UDF) в Fabric

Модуль предоставляет утилиты для интеграции кода блокнота с элементами функции работы с пользовательскими данными (UDF). Вы можете получить доступ к функциям из элемента UDF в одной рабочей области или в разных рабочих областях, а затем вызвать эти функции по мере необходимости. Элементы UDF повышают повторное использование кода, централизованное обслуживание и совместную работу команды.

Используйте служебные программы UDF для:

  • Извлечение функции — доступ к функциям из элементов UDF по имени.
  • Доступ между рабочими областями — использование функций из элементов UDF в других рабочих областях.
  • Обнаружение функций — проверка доступных функций и их сигнатур.
  • Гибкий вызов — вызов функций с параметрами, соответствующими языку.

Замечание

Для получения его функций требуется доступ на чтение к элементу UDF в целевой рабочей области. Исключения из функций UDF распространяются на вызываемую записную книжку.

В следующей таблице перечислены доступные методы UDF:

Метод Signature Описание
getFunctions getFunctions(udf: String, workspaceId: String = ""): UDF Извлекает все функции из элемента UDF по идентификатору артефакта или имени. Возвращает объект с вызываемыми атрибутами функции.

Возвращаемый объект предоставляет следующие свойства:

Недвижимость Тип Описание
functionDetails List Список словарей метаданных функции. Каждый словарь включает: Name (имя функции), (описание функции), Description (список определений параметров), ParametersFunctionReturnType (возвращаемый тип) и DataSourceConnections (используемые подключения к источнику данных).
itemDetails Словарь Словарь метаданных элемента UDF с ключами: Id (идентификатор артефакта), (имя элемента), NameWorkspaceId (идентификатор рабочей области) и CapacityId (идентификатор емкости).
<functionName> Callable Каждая функция в элементе UDF становится вызываемым методом возвращаемого объекта. Используйте myFunctions.functionName(...) для вызова.

Подсказка

Извлеките функции UDF один раз и кэшируйте объект-оболочку. Избегайте многократного вызова getFunctions() в цикле— кэшируйте результат, чтобы свести к минимуму затраты.

Получение функций из UDF

Используется notebookutils.udf.getFunctions() для получения всех функций из элемента UDF. При необходимости можно указать идентификатор рабочей области для доступа между рабочими областями.

# 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')

Вызов функции

После получения функций из элемента UDF вызовите их по имени. Python поддерживает позиционные и именованные параметры. Примеры Scala и R используют позиционные параметры.

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

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

Значения параметров по умолчанию

Fabric пользовательские функции данных поддерживают значения аргументов по умолчанию. При вызове функций, полученных с помощью notebookutils.udf.getFunctions, можно исключить любой параметр, имеющий определенный по умолчанию, — среда выполнения автоматически использует значение по умолчанию. Кроме того, можно указать именованные аргументы для переопределения конкретных значений по умолчанию, оставляя другие без изменений.

# 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')

Поддерживаемые типы входных данных по умолчанию

Следующие типы поддерживаются в качестве значений параметров по умолчанию:

Тип по умолчанию Notes
String Любая строка, сериализуемая в формате JSON.
Строка даты и времени Укажите строку в сигнатуре функции. Время выполнения преобразует это к datetime во время вызова. Используйте согласованный формат, например ISO 8601 (например, 2025-12-31T23:59:59Z).
Boolean True или False.
Integer Любое целочисленное значение.
Плавать Любое значение с плавающей запятой.
List Должен быть сериализуемым в формате JSON; предпочтительно использовать None в сигнатуре и присваивать внутри функции, чтобы избежать изменяемых значений по умолчанию.
Словарь Должен быть сериализуемым в формате JSON; предпочтительно использовать None в сигнатуре и присваивать внутри функции.
DataFrame pandas Предоставляется как объект JSON, который пакет SDK преобразует в тип pandas. Требуется fabric-user-data-functions версия 1.0.0 или более поздняя.
Серия pandas Предоставляется в виде массива объектов JSON, которые пакет SDK преобразует в тип pandas. Требуется fabric-user-data-functions версия 1.0.0 или более поздняя.

Ограничения и рекомендации

Значения по умолчанию должны быть сериализуемыми в формате JSON (наборы и кортежи не поддерживаются). Для списков или словарей по умолчанию используйте None сигнатуру и назначьте реальное значение по умолчанию внутри функции, чтобы избежать общих изменяемых значений по умолчанию. Используйте формат ISO 8601 (например, 2025-12-31T23:59:59Z) для даты и времени по умолчанию. Для использования pandas DataFrame или Series в качестве стандартной версии требуется fabric-user-data-functions версия 1.0.0 или более поздняя.

Отображение сведений

Вы можете программным образом проверять метаданные и подписи элементов UDF.

Отображение сведений об элементе UDF

display(myFunctions.itemDetails)

Отображение сведений о функции

display(myFunctions.functionDetails)

Подсказка

Всегда проверяйте functionDetails при работе с новым элементом UDF. Это помогает проверить доступные функции и ожидаемые типы параметров перед вызовом.

Обработка ошибок

Оберните вызовы UDF в соответствующую языковую обработку ошибок, чтобы корректно управлять отсутствующими функциями или непредвиденными типами параметров. Перед вызовом всегда убедитесь, что функция существует в элементе 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}")

Использование функций UDF в конвейере данных

Вы можете создавать функции UDF для создания повторно используемых шагов 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")

Это важно

Вызовы UDF имеют накладные расходы. При многократном вызове той же функции с теми же параметрами рекомендуется кэширование результата. Избегайте вызова функций UDF в жестких циклах, когда это возможно.