Поделиться через


Подключаемый модуль Python

Область применения: ✅Microsoft Fabric✅Azure Data Explorer

Подключаемый модуль Python запускает определяемую пользователем функцию (UDF) с помощью скрипта Python. Скрипт Python получает табличные данные в качестве входных данных и создает табличные выходные данные. Среда выполнения подключаемого модуля размещается в песочницах, запущенных на узлах кластера.

Синтаксис

T | evaluate [hint.distribution = ()] [hint.remote = (autosingleper_node | | local)] скрипт output_schema, [ , script_parameters] python([ , external_artifacts][, spill_to_disk])

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
output_schema string ✔️ Литерал type , определяющий выходную схему табличных данных, возвращаемый кодом Python. Формат: typeof(ColumnName: ColumnType[, ...]). Например, typeof(col1:string, col2:long). Чтобы расширить входную схему, используйте следующий синтаксис: typeof(*, col1:string, col2:long)
script string ✔️ Допустимый скрипт Python для выполнения. Сведения о создании многостроковых строк см . в советах по использованию.
script_parameters dynamic Контейнер свойств пар значений имени, передаваемых в скрипт Python в качестве зарезервированного kargs словаря. Дополнительные сведения см. в разделе "Зарезервированные переменные Python".
hint.distribution string Указание для выполнения подключаемого модуля распределено по нескольким узлам кластера. Значение по умолчанию — single. single означает, что один экземпляр скрипта будет выполняться по всем данным запроса. per_node Означает, что если запрос перед распространением блока Python, экземпляр скрипта будет выполняться на каждом узле в данных, содержащихся в нем.
hint.remote string Это указание относится только к запросам между кластерами. Значение по умолчанию — auto. auto означает, что сервер автоматически решает, в каком кластере выполняется код Python. Установка значения для local принудительного выполнения кода Python в локальном кластере. Используйте его, если подключаемый модуль Python отключен в удаленном кластере.
external_artifacts dynamic Контейнер свойств пары имен и URL-адресов для артефактов, доступных из облачного хранилища. Дополнительные возможности см. в статье "Использование внешних артефактов".
spill_to_disk bool Задает альтернативный метод сериализации входной таблицы в песочницу Python. Для сериализации больших таблиц он позволяет true ускорить сериализацию и значительно сократить потребление памяти песочницы. По умолчанию — true.

Зарезервированные переменные Python

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

  • df: входные табличные данные (значения T выше) в виде кадра pandas данных.
  • kargs: значение аргумента script_parameters в качестве словаря Python.
  • resultpandas: Кадр данных, созданный скриптом Python, значение которого становится табличными данными, которые отправляются оператору запроса Kusto, который следует подключаемого модуля.

Включение подключаемого модуля

Подключаемый модуль отключен по умолчанию. Перед началом работы просмотрите список необходимых компонентов. Чтобы включить подключаемый модуль и выбрать версию образа Python, см. раздел "Включить расширения языка" в кластере.

Изображение песочницы Python

Чтобы изменить версию образа Python на другой управляемый или настраиваемый образ, см . статью "Изменение образа языка Python" в кластере.

Список пакетов для различных образов Python см . в справочнике по пакету Python.

Примечание.

  • По умолчанию подключаемый модуль импортирует число как np и pandas в виде pd. При необходимости можно импортировать другие модули.
  • Некоторые пакеты могут быть несовместимы с ограничениями, применяемыми песочницей, в которой выполняется подключаемый модуль.

Использование приема из политики запроса и обновления

  • Используйте подключаемый модуль в запросах, которые:
    • Определяется как часть политики обновления, исходная таблица которой используется для приема непотоковых потоков.
    • Запустите как часть команды, которая выполняет прием из запроса, например .set-or-append.
  • Вы не можете использовать подключаемый модуль в запросе, который определяется как часть политики обновления, исходная таблица которой выполняется с помощью приема потоковой передачи.

Примеры

range x from 1 to 360 step 1
| evaluate python(
//
typeof(*, fx:double),               //  Output schema: append a new fx column to original table 
```
result = df
n = df.shape[0]
g = kargs["gain"]
f = kargs["cycles"]
result["fx"] = g * np.sin(df["x"]/n*2*np.pi*f)
```
, bag_pack('gain', 100, 'cycles', 4)    //  dictionary of parameters
)
| render linechart 

Снимок экрана: демонстрация синусов с результатом запроса.

print "This is an example for using 'external_artifacts'"
| evaluate python(
    typeof(File:string, Size:string), ```if 1:
    import os
    result = pd.DataFrame(columns=['File','Size'])
    sizes = []
    path = '.\\\\Temp'
    files = os.listdir(path)
    result['File']=files
    for file in files:
        sizes.append(os.path.getsize(path + '\\\\' + file))
    result['Size'] = sizes
    ```,
    external_artifacts = 
        dynamic({"this_is_my_first_file":"https://kustoscriptsamples.blob.core.windows.net/samples/R/sample_script.r",
                 "this_is_a_script":"https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py"})
)
Файлы Размер
this_is_a_script 120
this_is_my_first_file 105

Советы по производительности

  • Уменьшите входной набор данных подключаемого модуля до минимального количества обязательных (столбцов и строк).
    • Используйте фильтры в исходном наборе данных, когда это возможно, с языком запросов Kusto.
    • Для вычисления подмножества исходных столбцов проектировать только эти столбцы перед вызовом подключаемого модуля.
  • Используйте hint.distribution = per_node всякий раз, когда логика в скрипте распространяется.
    • Можно также использовать оператор секционирования для секционирования входного набора данных.
  • Используйте язык запросов Kusto всякий раз, чтобы реализовать логику скрипта Python.

Советы по использованию

  • Чтобы создать многострочные строки, содержащие скрипт Python в редакторе запросов, скопируйте скрипт Python из избранного редактора Python (Jupyter, Visual Studio Code, PyCharm и т. д.), вставьте его в редактор запросов, а затем заключите полный скрипт между строками, содержащими три последовательных обратных выражения. Например:

    ```
    python code
    ```

  • externaldata Используйте оператор, чтобы получить содержимое скрипта, который вы сохранили во внешнем расположении, например хранилище BLOB-объектов Azure.

Пример

    let script = 
        externaldata(script:string)
        [h'https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py']
        with(format = raw);
    range x from 1 to 360 step 1
    | evaluate python(
        typeof(*, fx:double),
        toscalar(script), 
        bag_pack('gain', 100, 'cycles', 4))
    | render linechart 

Использование внешних артефактов

Внешние артефакты из облачного хранилища можно сделать доступными для скрипта и использовать во время выполнения.

URL-адреса, на которые ссылается свойство внешних артефактов, должны быть:

Примечание.

При проверке подлинности внешних артефактов с помощью управляемых SandboxArtifacts удостоверений необходимо определить использование в политике управляемого удостоверения на уровне кластера.

Артефакты становятся доступными для использования скриптом из локального временного каталога .\Temp. Имена, указанные в контейнере свойств, используются в качестве имен локальных файлов. См. примеры.

Сведения о ссылке на внешние пакеты см. в разделе "Установка пакетов" для подключаемого модуля Python.

Обновление внешнего кэша артефактов

Внешние файлы артефактов, используемые в запросах, кэшируются в кластере. Если вы обновляете файлы в облачном хранилище и требуете немедленной синхронизации с кластером , можно использовать команду .clear cluster cache external-artifacts. Эта команда очищает кэшированные файлы и гарантирует, что последующие запросы выполняются с последней версией артефактов.

Установка пакетов для подключаемого модуля Python

В большинстве случаев может потребоваться создать пользовательский образ.

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

  • У вас нет разрешений на создание пользовательского образа.
  • Пакет является частным.
  • Вы предпочитаете создать нерегламентированный пакет для тестирования и не хотите, чтобы затраты на создание пользовательского образа.

Установите пакеты следующим образом:

Необходимые компоненты

  1. Создайте контейнер BLOB-объектов для размещения пакетов, желательно в том же месте, что и кластер. Например, предположим, что https://artifactswestus.blob.core.windows.net/pythonкластер находится в западной части США.

  2. Измените политику выноски кластера, чтобы разрешить доступ к такому расположению.

    • Для этого изменения требуются разрешения AllDatabasesAdmin .

    • Например, чтобы включить доступ к большому двоичному объекту, расположенному в https://artifactswestus.blob.core.windows.net/python, выполните следующую команду:

    .alter-merge cluster policy callout @'[ { "CalloutType": "sandbox_artifacts", "CalloutUriRegex": "artifactswestus\\.blob\\.core\\.windows\\.net/python/","CanCall": true } ]'
    

Установка пакетов

  1. Для общедоступных пакетов в PyPi или других каналах скачайте пакет и его зависимости.

    • В окне cmd в локальной среде Python для Windows выполните следующие действия:
    pip wheel [-w download-dir] package-name.
    
  2. Создайте ZIP-файл, содержащий необходимый пакет и его зависимости.

    • Для частных пакетов запакуйте папку пакета и папки его зависимостей.
    • Для общедоступных пакетов zip-файлы, скачанные на предыдущем шаге.

    Примечание.

    • Скачайте пакет, совместимый с подсистемой Python и платформой среды выполнения песочницы (в настоящее время 3.6.5 в Windows)
    • Не забудьте запаковать .whl сами файлы, а не родительскую папку.
    • Файлы для пакетов, которые уже существуют с той же версией, можно пропустить .whl в базовом образе песочницы.
  3. Отправьте zippped-файл в большой двоичный объект в расположении артефактов (с шага 1).

  4. Вызов подключаемого python модуля.

    • external_artifacts Укажите параметр с контейнером свойств имени и ссылкой на ZIP-файл (URL-адрес большого двоичного объекта, включая маркер SAS).
    • В встроенном коде Python импортируйте и вызовите Zipackage sandbox_utils его install() метод с именем ZIP-файла.

Пример

Установите пакет Faker, который создает поддельные данные.

range ID from 1 to 3 step 1 
| extend Name=''
| evaluate python(typeof(*), ```if 1:
    from sandbox_utils import Zipackage
    Zipackage.install("Faker.zip")
    from faker import Faker
    fake = Faker()
    result = df
    for i in range(df.shape[0]):
        result.loc[i, "Name"] = fake.name()
    ```,
    external_artifacts=bag_pack('faker.zip', 'https://artifacts.blob.core.windows.net/Faker.zip?*** REPLACE WITH YOUR SAS TOKEN ***'))
ИД Имя.
1 Гэри Тапия
2 Эмма Эванс
3 Эшли Боуэн

Дополнительные примеры функций UDF, использующих подключаемый модуль Python, см. в библиотеке функций.

Подключаемый модуль Python запускает определяемую пользователем функцию (UDF) с помощью скрипта Python. Скрипт Python получает табличные данные в качестве входных данных и создает табличные выходные данные.

Синтаксис

T | evaluate [ ()] [hint.remote = =hint.distribution (autoper_node | local | single)] скрипт output_schema, [, script_parameters]python( [, spill_to_disk])

Дополнительные сведения о соглашениях синтаксиса.

Параметры

Имя (название) Type Обязательно Описание
output_schema string ✔️ Литерал type , определяющий выходную схему табличных данных, возвращаемый кодом Python. Формат: typeof(ColumnName: ColumnType[, ...]). Например, typeof(col1:string, col2:long). Чтобы расширить входную схему, используйте следующий синтаксис: typeof(*, col1:string, col2:long)
script string ✔️ Допустимый скрипт Python для выполнения. Сведения о создании многостроковых строк см . в советах по использованию.
script_parameters dynamic Контейнер свойств пар значений имени, передаваемых в скрипт Python в качестве зарезервированного kargs словаря. Дополнительные сведения см. в разделе "Зарезервированные переменные Python".
hint.distribution string Указание для выполнения подключаемого модуля распределено по нескольким узлам кластера. Значение по умолчанию — single. single означает, что один экземпляр скрипта будет выполняться по всем данным запроса. per_node Означает, что если запрос перед распространением блока Python, экземпляр скрипта будет выполняться на каждом узле в данных, содержащихся в нем.
hint.remote string Это указание относится только к запросам между кластерами. Значение по умолчанию — auto. auto означает, что сервер автоматически решает, в каком кластере выполняется код Python. Установка значения для local принудительного выполнения кода Python в локальном кластере. Используйте его, если подключаемый модуль Python отключен в удаленном кластере.
spill_to_disk bool Задает альтернативный метод сериализации входной таблицы в песочницу Python. Для сериализации больших таблиц он позволяет true ускорить сериализацию и значительно сократить потребление памяти песочницы. По умолчанию — true.

Зарезервированные переменные Python

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

  • df: входные табличные данные (значения T выше) в виде кадра pandas данных.
  • kargs: значение аргумента script_parameters в качестве словаря Python.
  • resultpandas: Кадр данных, созданный скриптом Python, значение которого становится табличными данными, которые отправляются оператору запроса Kusto, который следует подключаемого модуля.

Включение подключаемого модуля

Подключаемый модуль отключен по умолчанию. Прежде чем начать, включите подключаемый модуль Python в базе данных KQL.

Изображение песочницы Python

Список пакетов для различных образов Python см . в справочнике по пакету Python.

Примечание.

  • По умолчанию подключаемый модуль импортирует число как np и pandas в виде pd. При необходимости можно импортировать другие модули.
  • Некоторые пакеты могут быть несовместимы с ограничениями, применяемыми песочницей, в которой выполняется подключаемый модуль.

Использование приема из политики запроса и обновления

  • Используйте подключаемый модуль в запросах, которые:
    • Определяется как часть политики обновления, исходная таблица которой используется для приема непотоковых потоков.
    • Запустите как часть команды, которая выполняет прием из запроса, например .set-or-append.
  • Вы не можете использовать подключаемый модуль в запросе, который определяется как часть политики обновления, исходная таблица которой выполняется с помощью приема потоковой передачи.

Примеры

range x from 1 to 360 step 1
| evaluate python(
//
typeof(*, fx:double),               //  Output schema: append a new fx column to original table 
```
result = df
n = df.shape[0]
g = kargs["gain"]
f = kargs["cycles"]
result["fx"] = g * np.sin(df["x"]/n*2*np.pi*f)
```
, bag_pack('gain', 100, 'cycles', 4)    //  dictionary of parameters
)
| render linechart 

Снимок экрана: демонстрация синусов с результатом запроса.

Советы по производительности

  • Уменьшите входной набор данных подключаемого модуля до минимального количества обязательных (столбцов и строк).
    • Используйте фильтры в исходном наборе данных, когда это возможно, с языком запросов Kusto.
    • Для вычисления подмножества исходных столбцов проектировать только эти столбцы перед вызовом подключаемого модуля.
  • Используйте hint.distribution = per_node всякий раз, когда логика в скрипте распространяется.
    • Можно также использовать оператор секционирования для секционирования входного набора данных.
  • Используйте язык запросов Kusto всякий раз, чтобы реализовать логику скрипта Python.

Советы по использованию

  • Чтобы создать многострочные строки, содержащие скрипт Python в редакторе запросов, скопируйте скрипт Python из избранного редактора Python (Jupyter, Visual Studio Code, PyCharm и т. д.), вставьте его в редактор запросов, а затем заключите полный скрипт между строками, содержащими три последовательных обратных выражения. Например:

    ```
    python code
    ```

  • externaldata Используйте оператор, чтобы получить содержимое скрипта, который вы сохранили во внешнем расположении, например хранилище BLOB-объектов Azure.

Пример

    let script = 
        externaldata(script:string)
        [h'https://kustoscriptsamples.blob.core.windows.net/samples/python/sample_script.py']
        with(format = raw);
    range x from 1 to 360 step 1
    | evaluate python(
        typeof(*, fx:double),
        toscalar(script), 
        bag_pack('gain', 100, 'cycles', 4))
    | render linechart 

Дополнительные примеры функций UDF, использующих подключаемый модуль Python, см. в библиотеке функций.