Plug-in do Python
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer
O plug-in do Python executa uma UDF (função definida pelo usuário) usando um script Python. O script Python obtém dados tabulares como sua entrada e produz a saída tabular. O tempo de execução do plug-in é hospedado em sandboxes, em execução nos nós do cluster.
Sintaxe
T |
evaluate
[ =
hint.distribution
(single
per_node
| )] [ =
hint.remote
(auto
local
| )]python(
output_schema,
script [,
script_parameters] [ ,
external_artifacts][,
spill_to_disk])
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Digitar | Obrigatória | Descrição |
---|---|---|---|
output_schema | string |
✔️ | Um type literal que define o esquema de saída dos dados tabulares, retornados pelo código Python. O formato é: typeof( ColumnName : ColumnType[, ...]) . Por exemplo, typeof(col1:string, col2:long) . Para estender o esquema de entrada, use a seguinte sintaxe: typeof(*, col1:string, col2:long) . |
script | string |
✔️ | O script Python válido a ser executado. Para gerar cadeias de caracteres de várias linhas, consulte Dicas de uso. |
script_parameters | dynamic |
Um recipiente de propriedades de pares de valores de nome a serem passados para o script Python como o dicionário reservado kargs . Para obter mais informações, consulte Variáveis reservadas do Python. |
|
hint.distribution | string |
Uma dica para que a execução do plug-in seja distribuída em vários nós de cluster. O valor padrão é single . single significa que uma única instância do script será executada em todos os dados da consulta. per_node significa que, se a consulta antes do bloco Python for distribuída, uma instância do script será executada em cada nó, nos dados que ele contém. |
|
dica.remoto | string |
Essa dica só é relevante para consultas entre clusters. O valor padrão é auto . auto significa que o servidor decide automaticamente em qual cluster o código Python é executado. Definir o valor para local forçar a execução do código Python no cluster local. Use-o caso o plug-in Python esteja desabilitado no cluster remoto. |
|
external_artifacts | dynamic |
Um recipiente de propriedades de pares de nome e URL para artefatos que podem ser acessados no armazenamento em nuvem. Veja mais em Usando artefatos externos. | |
spill_to_disk | bool |
Especifica um método alternativo para serializar a tabela de entrada para a área restrita do Python. Para serializar tabelas grandes, defina-o para true acelerar a serialização e reduzir significativamente o consumo de memória da área restrita. O padrão é true . |
Variáveis reservadas do Python
As variáveis a seguir são reservadas para interação entre a Linguagem de Consulta Kusto e o código Python.
df
: Os dados tabulares de entrada (os valores acimaT
), como umpandas
DataFrame.kargs
: O valor do argumento script_parameters , como um dicionário Python.result
: Umpandas
DataFrame criado pelo script Python, cujo valor se torna os dados tabulares que são enviados para o operador de consulta Kusto que segue o plug-in.
Habilitar o plug-in
O plug-in está desabilitado por padrão. Antes de começar, revise a lista de pré-requisitos. Para habilitar o plug-in e selecionar a versão da imagem do Python, consulte Habilitar extensões de linguagem em seu cluster.
Imagem de sandbox Python
Para alterar a versão da imagem do Python para uma imagem gerenciada diferente ou uma imagem personalizada, consulte Alterar a imagem de extensões de linguagem do Python no cluster.
Para ver a lista de pacotes para as diferentes imagens do Python, consulte Referência de pacote do Python.
Observação
- Por padrão, o plug-in importa numpy como np e pandas como pd. Opcionalmente, você pode importar outros módulos conforme necessário.
- Alguns pacotes podem ser incompatíveis com as limitações impostas pela sandbox onde o plug-in é executado.
Usar a ingestão da política de consulta e atualização
- Use o plug-in em consultas que são:
- Definido como parte de uma política de atualização, cuja tabela de origem é ingerida usando a ingestão de não streaming .
- Execute como parte de um comando que ingere de uma consulta, como
.set-or-append
.
- Você não pode usar o plug-in em uma consulta definida como parte de uma política de atualização, cuja tabela de origem é ingerida usando a ingestão de streaming.
Exemplos
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"})
)
Arquivo | Tamanho |
---|---|
this_is_a_script | 120 |
this_is_my_first_file | 105 |
Dicas de desempenho
- Reduza o conjunto de dados de entrada do plug-in para a quantidade mínima necessária (colunas/linhas).
- Use filtros no conjunto de dados de origem, quando possível, com a linguagem de consulta do Kusto.
- Para fazer um cálculo em um subconjunto das colunas de origem, projete apenas essas colunas antes de invocar o plug-in.
- Use
hint.distribution = per_node
sempre que a lógica em seu script for distribuível.- Você também pode usar o operador de partição para particionar o conjunto de dados de entrada.
- Use a linguagem de consulta do Kusto sempre que possível, para implementar a lógica do seu script Python.
Dicas de uso
Para gerar cadeias de caracteres de várias linhas contendo o script Python no editor de consultas, copie o script Python do editor Python favorito (Jupyter, Visual Studio Code, PyCharm e assim por diante), cole-o no editor de consultas e coloque o script completo entre as linhas que contêm três acentos graves consecutivos. Por exemplo:
```
python code
```
Use o operador para obter o conteúdo de um script que você armazenou em um local externo, como o
externaldata
Armazenamento de Blobs do Azure.
Exemplo
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
Usando artefatos externos
Artefatos externos do armazenamento em nuvem podem ser disponibilizados para o script e usados no runtime.
As URLs referenciadas pela propriedade de artefatos externos devem ser:
- Incluído na política de texto explicativo do cluster.
- Em um local disponível publicamente ou forneça as credenciais necessárias, conforme explicado em cadeias de conexão de armazenamento.
Observação
Ao autenticar artefatos externos usando Identidades Gerenciadas, o SandboxArtifacts
uso deve ser definido na política de identidade gerenciada no nível do cluster.
Os artefatos são disponibilizados para o script consumir a partir de um diretório temporário local, .\Temp
. Os nomes fornecidos no recipiente de propriedades são usados como os nomes de arquivo locais. Veja os exemplos.
Para obter informações sobre como referenciar pacotes externos, consulte Instalar pacotes para o plug-in Python.
Atualizando o cache de artefato externo
Os arquivos de artefato externos utilizados em consultas são armazenados em cache no cluster. Se você fizer atualizações em seus arquivos no armazenamento em nuvem e precisar de sincronização imediata com seu cluster, poderá usar o comando .clear cluster cache external-artifacts. Esse comando limpa os arquivos armazenados em cache e garante que as consultas subsequentes sejam executadas com a versão mais recente dos artefatos.
Instalar pacotes para o plug-in Python
Na maioria dos casos de uso, talvez você prefira criar uma imagem personalizada.
Você pode querer instalar o(s) pacote(s) por conta própria, pelos seguintes motivos:
- Você não tem permissões para criar uma imagem personalizada.
- O pacote é privado.
- Você prefere criar uma instalação de pacote ad hoc para teste e não quer a sobrecarga de criar uma imagem personalizada.
Instale os pacotes da seguinte maneira:
Pré-requisitos
Crie um contêiner de blob para hospedar os pacotes, preferencialmente no mesmo local que o cluster. Por exemplo,
https://artifactswestus.blob.core.windows.net/python
supondo que o cluster esteja no Oeste dos EUA.Altere a política de texto explicativo do cluster para permitir o acesso a esse local.
Essa alteração requer permissões AllDatabasesAdmin .
Por exemplo, para habilitar o acesso a um blob localizado em
https://artifactswestus.blob.core.windows.net/python
, execute o seguinte comando:
.alter-merge cluster policy callout @'[ { "CalloutType": "sandbox_artifacts", "CalloutUriRegex": "artifactswestus\\.blob\\.core\\.windows\\.net/python/","CanCall": true } ]'
Instalar Pacotes
Para pacotes públicos no PyPi ou em outros canais, baixe o pacote e suas dependências.
- Em uma janela cmd em seu ambiente local do Windows Python, execute:
pip wheel [-w download-dir] package-name.
Crie um arquivo ZIP que contenha o pacote necessário e suas dependências.
- Para pacotes privados, compacte a pasta do pacote e as pastas de suas dependências.
- Para pacotes públicos, compacte os arquivos que foram baixados na etapa anterior.
Observação
- Certifique-se de baixar o pacote compatível com o mecanismo Python e a plataforma do tempo de execução sandbox (atualmente 3.6.5 no Windows)
- Certifique-se de compactar os próprios arquivos e não a
.whl
pasta pai. - Você pode ignorar
.whl
arquivos para pacotes que já existem com a mesma versão na imagem de sandbox base.
Carregue o arquivo compactado em um blob no local dos artefatos (da etapa 1).
Chame o
python
plug-in.- Especifique o
external_artifacts
parâmetro com um recipiente de propriedades de name e referência ao arquivo ZIP (a URL do blob, incluindo um token SAS). - Em seu código python embutido, importe
Zipackage
sandbox_utils
e chame seuinstall()
método com o nome do arquivo ZIP.
- Especifique o
Exemplo
Instale o pacote Faker que gera dados falsos.
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 ***'))
ID | Nome |
---|---|
1 | Gary Tapia |
2 | Emma Evans |
3 | Ashley Bowen |
Conteúdo relacionado
Para obter mais exemplos de funções UDF que usam o plug-in Python, consulte a biblioteca de funções.
O plug-in do Python executa uma UDF (função definida pelo usuário) usando um script Python. O script Python obtém dados tabulares como sua entrada e produz a saída tabular.
Sintaxe
T |
evaluate
[hint.distribution
=
( | single
per_node
)] [hint.remote
=
(auto
| local
)] python(
output_schema ,
script [,
script_parameters] [,
spill_to_disk])
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Digitar | Obrigatória | Descrição |
---|---|---|---|
output_schema | string |
✔️ | Um type literal que define o esquema de saída dos dados tabulares, retornados pelo código Python. O formato é: typeof( ColumnName : ColumnType[, ...]) . Por exemplo, typeof(col1:string, col2:long) . Para estender o esquema de entrada, use a seguinte sintaxe: typeof(*, col1:string, col2:long) . |
script | string |
✔️ | O script Python válido a ser executado. Para gerar cadeias de caracteres de várias linhas, consulte Dicas de uso. |
script_parameters | dynamic |
Um recipiente de propriedades de pares de valores de nome a serem passados para o script Python como o dicionário reservado kargs . Para obter mais informações, consulte Variáveis reservadas do Python. |
|
hint.distribution | string |
Uma dica para que a execução do plug-in seja distribuída em vários nós de cluster. O valor padrão é single . single significa que uma única instância do script será executada em todos os dados da consulta. per_node significa que, se a consulta antes do bloco Python for distribuída, uma instância do script será executada em cada nó, nos dados que ele contém. |
|
dica.remoto | string |
Essa dica só é relevante para consultas entre clusters. O valor padrão é auto . auto significa que o servidor decide automaticamente em qual cluster o código Python é executado. Definir o valor para local forçar a execução do código Python no cluster local. Use-o caso o plug-in Python esteja desabilitado no cluster remoto. |
|
spill_to_disk | bool |
Especifica um método alternativo para serializar a tabela de entrada para a área restrita do Python. Para serializar tabelas grandes, defina-o para true acelerar a serialização e reduzir significativamente o consumo de memória da área restrita. O padrão é true . |
Variáveis reservadas do Python
As variáveis a seguir são reservadas para interação entre a Linguagem de Consulta Kusto e o código Python.
df
: Os dados tabulares de entrada (os valores acimaT
), como umpandas
DataFrame.kargs
: O valor do argumento script_parameters , como um dicionário Python.result
: Umpandas
DataFrame criado pelo script Python, cujo valor se torna os dados tabulares que são enviados para o operador de consulta Kusto que segue o plug-in.
Habilitar o plug-in
O plug-in está desabilitado por padrão. Antes de começar, habilite o plug-in do Python no banco de dados KQL.
Imagem de sandbox Python
Para ver a lista de pacotes para as diferentes imagens do Python, consulte Referência de pacote do Python.
Observação
- Por padrão, o plug-in importa numpy como np e pandas como pd. Opcionalmente, você pode importar outros módulos conforme necessário.
- Alguns pacotes podem ser incompatíveis com as limitações impostas pela sandbox onde o plug-in é executado.
Usar a ingestão da política de consulta e atualização
- Use o plug-in em consultas que são:
- Definido como parte de uma política de atualização, cuja tabela de origem é ingerida usando a ingestão de não streaming .
- Execute como parte de um comando que ingere de uma consulta, como
.set-or-append
.
- Você não pode usar o plug-in em uma consulta definida como parte de uma política de atualização, cuja tabela de origem é ingerida usando a ingestão de streaming.
Exemplos
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
Dicas de desempenho
- Reduza o conjunto de dados de entrada do plug-in para a quantidade mínima necessária (colunas/linhas).
- Use filtros no conjunto de dados de origem, quando possível, com a linguagem de consulta do Kusto.
- Para fazer um cálculo em um subconjunto das colunas de origem, projete apenas essas colunas antes de invocar o plug-in.
- Use
hint.distribution = per_node
sempre que a lógica em seu script for distribuível.- Você também pode usar o operador de partição para particionar o conjunto de dados de entrada.
- Use a linguagem de consulta do Kusto sempre que possível, para implementar a lógica do seu script Python.
Dicas de uso
Para gerar cadeias de caracteres de várias linhas contendo o script Python no editor de consultas, copie o script Python do editor Python favorito (Jupyter, Visual Studio Code, PyCharm e assim por diante), cole-o no editor de consultas e coloque o script completo entre as linhas que contêm três acentos graves consecutivos. Por exemplo:
```
python code
```
Use o operador para obter o conteúdo de um script que você armazenou em um local externo, como o
externaldata
Armazenamento de Blobs do Azure.
Exemplo
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
Conteúdo relacionado
Para obter mais exemplos de funções UDF que usam o plug-in Python, consulte a biblioteca de funções.