Подключаемый модуль Python
Область применения: ✅Microsoft Fabric✅Azure Data Explorer
Подключаемый модуль Python запускает определяемую пользователем функцию (UDF) с помощью скрипта Python. Скрипт Python получает табличные данные в качестве входных данных и создает табличные выходные данные. Среда выполнения подключаемого модуля размещается в песочницах, запущенных на узлах кластера.
Синтаксис
T |
evaluate
[hint.distribution
=
()] [hint.remote
=
(auto
single
per_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.result
pandas
: Кадр данных, созданный скриптом 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
В большинстве случаев может потребоваться создать пользовательский образ.
Вы можете самостоятельно установить пакеты по следующим причинам:
- У вас нет разрешений на создание пользовательского образа.
- Пакет является частным.
- Вы предпочитаете создать нерегламентированный пакет для тестирования и не хотите, чтобы затраты на создание пользовательского образа.
Установите пакеты следующим образом:
Необходимые компоненты
Создайте контейнер BLOB-объектов для размещения пакетов, желательно в том же месте, что и кластер. Например, предположим, что
https://artifactswestus.blob.core.windows.net/python
кластер находится в западной части США.Измените политику выноски кластера, чтобы разрешить доступ к такому расположению.
Для этого изменения требуются разрешения 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 } ]'
Установка пакетов
Для общедоступных пакетов в PyPi или других каналах скачайте пакет и его зависимости.
- В окне cmd в локальной среде Python для Windows выполните следующие действия:
pip wheel [-w download-dir] package-name.
Создайте ZIP-файл, содержащий необходимый пакет и его зависимости.
- Для частных пакетов запакуйте папку пакета и папки его зависимостей.
- Для общедоступных пакетов zip-файлы, скачанные на предыдущем шаге.
Примечание.
- Скачайте пакет, совместимый с подсистемой Python и платформой среды выполнения песочницы (в настоящее время 3.6.5 в Windows)
- Не забудьте запаковать
.whl
сами файлы, а не родительскую папку. - Файлы для пакетов, которые уже существуют с той же версией, можно пропустить
.whl
в базовом образе песочницы.
Отправьте zippped-файл в большой двоичный объект в расположении артефактов (с шага 1).
Вызов подключаемого
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
(auto
per_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.result
pandas
: Кадр данных, созданный скриптом 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, см. в библиотеке функций.