Partilhar via


Plug-in do Python

Aplica-se a: ✅Microsoft FabricAzure 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 (singleper_node | )] [ =hint.remote (autolocal | )]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 acima T ), como um pandas DataFrame.
  • kargs: O valor do argumento script_parameters , como um dicionário Python.
  • result: Um pandas 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 

Captura de tela da demonstração senoidal mostrando o resultado da consulta.

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

  1. 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/pythonsupondo que o cluster esteja no Oeste dos EUA.

  2. 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

  1. 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.
    
  2. 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.
  3. Carregue o arquivo compactado em um blob no local dos artefatos (da etapa 1).

  4. 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 seu install() método com o nome do arquivo ZIP.

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

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 = ( | singleper_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 acima T ), como um pandas DataFrame.
  • kargs: O valor do argumento script_parameters , como um dicionário Python.
  • result: Um pandas 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 

Captura de tela da demonstração senoidal mostrando o resultado da consulta.

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 

Para obter mais exemplos de funções UDF que usam o plug-in Python, consulte a biblioteca de funções.