Exercício - Introduza variáveis usando a instrução let

Concluído

Usamos um conjunto de dados meteorológicos para agregar e visualizar dados. Aqui, você aprenderá a usar let instruções para introduzir variáveis e organizar consultas complexas.

let As instruções são úteis para dividir uma expressão complexa em várias partes, definir constantes fora do corpo da consulta para legibilidade ou definir uma variável uma vez e usá-la várias vezes dentro de uma consulta. Você pode usar let instruções para criar consultas complexas bem organizadas. Você pode usar várias let instruções, cada instrução deve ser seguida por um ponto-e-vírgula (;).

Você pode usar let instruções em diferentes tipos de situações. No nível mais simples, você pode definir valores escalares que serão referenciados posteriormente em uma consulta, como int, string, data/hora ou qualquer outro valor. Você pode criar uma exibição filtrada tabular de uma tabela que será usada como a entrada tabular para a consulta. Você também pode criar uma função usando uma let instrução.

Definir um escalar com uma let instrução

Lembre-se de que as consultas anteriores foram filtradas em locais ou danos mínimos. Vamos definir esses valores de limite usando uma let instrução no início da consulta.

A consulta a seguir usa duas let instruções para definir valores escalares que serão usados posteriormente como parâmetros de entrada na consulta. O primeiro valor definido é um número e o segundo é uma cadeia de caracteres. As let instruções terminam com ponto e vírgula.

Observe as partes comentadas da consulta que começam com barras duplas (//). As barras duplas indicam o início de um comentário até o final da linha. Estes são comentários que são ignorados ao executar consultas.

  1. Execute a seguinte consulta:

    Executar a consulta

    let MinDamage = 1; // int
    let EventLocation = "ARIZONA"; // string
    StormEvents
    | where State == EventLocation
    | where DamageCrops + DamageProperty >= MinDamage
    | summarize Damage=round(avg(DamageProperty + DamageCrops)) by EventType
    | sort by Damage
    

    Você deve obter resultados parecidos com a seguinte imagem:

    Screenshot of query using the let statement and its results.

  2. Tente alterar o nome do estado ou os números mínimos de danos e execute novamente a consulta. Como mudam os resultados?

Converter um resultado tabular em um valor escalar usando toscalar dentro de uma let instrução

Em seguida, vamos examinar uma contagem do tipo de evento mais frequente em função do tempo. Primeiro, você precisa descobrir qual é o tipo de evento mais frequente. Em seguida, você usará esse valor em uma consulta. Use a tabela StormEvents para localizar o EventType superior contando o número de eventos dentro de cada tipo. Use o project operador para retornar somente a coluna EventType .

Antes de começar a construir a instrução, execute a let consulta para descobrir o que esse evento realmente é. Isso permite que você verifique se sua consulta está produzindo os resultados esperados.

Executar a consulta

StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType

Você deve obter resultados parecidos com a seguinte imagem:

Screenshot of preview of let query using complicated scalar and results.

Você notará que a consulta produziu um resultado tabular com uma coluna e uma linha. No entanto, convém convertê-lo em um valor escalar para usar como um valor de filtro em sua consulta principal. Primeiro, defina o nome da variável que queremos introduzir como MostFrequentEventType. Em seguida, você deseja converter o resultado tabular em um valor escalar colocando toda a consulta dentro da toscalar() função.

As etapas anteriores são resumidas na seguinte let declaração:

let MostFrequentEventType = toscalar(
    StormEvents
    | summarize count() by EventType
    | top 1 by count_
    | project EventType);

Observe que essa instrução por si só não é uma consulta válida, porque uma consulta válida deve conter pelo menos uma instrução que não seja uma let instrução. No entanto, você pode usar esse valor escalar armazenado em uma consulta. Lembre-se de que você deseja olhar para uma contagem do tempo de evento mais frequente em função do tempo. Você filtrará MostFrequentEventType e, em seguida, resumirá a contagem por um determinado compartimento de tempo.

Neste caso, vejamos os resultados por mês. Você usará a startofmonth() função, que retorna uma data/hora que representa o início do mês para o valor de data determinado. Nesta consulta, você usará a coluna StartTime como entrada para a startofmonth() função.

Finalmente, renderize os resultados como um gráfico de colunas para obter um histograma da contagem do tipo de evento mais frequente vinculado por mês.

  1. Execute a seguinte consulta:

    Executar a consulta

    let MostFrequentEventType = toscalar(
        StormEvents
        | summarize count() by EventType
        | top 1 by count_
        | project EventType);
    StormEvents
    | where EventType == MostFrequentEventType
    | summarize count() by startofmonth(StartTime)
    | render columnchart
    

    Você deve obter resultados parecidos com a seguinte imagem:

    Screenshot of let query using complicated scalar and results.

  2. Tente alterar a consulta para mostrar um histograma do tipo de evento menos frequente vinculado por mês e executar novamente a consulta.

Construir uma let instrução com saída tabular

Os exemplos anteriores criaram um valor escalar armazenado para ser usado como um parâmetro de entrada em uma consulta. No entanto, também é possível usar uma instrução para criar dados tabulares que são usados como entrada para uma let consulta.

  1. Filtre a tabela StormEvents em eventos que causaram mortes direta ou indiretamente. Em seguida, retorne um subconjunto das colunas usando o project operador . Esta instrução fornece uma saída tabular chamada KillerStorms. Use esta let instrução como a entrada inicial para sua consulta.

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    
  2. Em seguida, você pode usar algumas das funções de agregação que aprendeu em unidades anteriores. Execute a seguinte consulta:

    Executar a consulta

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    KillerStorms
    | summarize DistinctKillerEventTypes=dcount(EventType), TotalDeaths=sum(Deaths) by State
    | sort by TotalDeaths
    

    Você deve obter resultados parecidos com a seguinte imagem:

    Screenshot of tabular let statement and results.

  3. Veja os resultados. Todos os eventos são resumidos na coluna DistinctKillerEventTypes as chamadas "tempestades assassinas"?

Criar uma função definida pelo usuário com a let instrução

Você também pode usar let instruções para definir funções definidas pelo usuário, que são subconsultas reutilizáveis. Suponha que você queira descobrir qual porcentagem de cada tipo de evento causou danos. Você criará uma função definida pelo usuário que calculará porcentagens e, posteriormente, chamará essa função e especificará quais colunas devem ser usadas para calcular a porcentagem.

Em uma let instrução, você declarará o nome da função, os argumentos e o corpo usando a seguinte sintaxe geral:

let function=(argument1:datatype, argument2:datatype) {functionbody};

Especificamente, você usará uma função definida pelo usuário para calcular porcentagens. Primeiro, defina o tipo de dados e os argumentos de entrada. Para este exemplo, você usará os seguintes argumentos:

Nome do argumento Tipo de dados Description
porção real A parte do total de eventos que você deseja calcular a porcentagem de.
total real O número total de eventos.

Você arredondará a resposta para duas casas decimais usando a round() função.

Em conjunto, a função definida pelo usuário descrita pela let instrução é:

let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
  1. Use esta let instrução na seguinte consulta:

    Executar a consulta

    let Pcent = (portion: real, total: real) { round(100 * portion / total, 2) };
    StormEvents
    | extend Damage = DamageCrops + DamageProperty
    | summarize TotalEvents = count(), TotalDamagingEvents = countif(Damage > 0) by EventType
    | project EventType, TotalDamagingEvents, TotalEvents, Percentage = Pcent(TotalDamagingEvents, TotalEvents)
    | sort by EventType asc
    

    Você deve obter resultados parecidos com a seguinte imagem:

    Screenshot of let statement with results.

  2. Reserve um momento para entender os resultados. Tente modificar a consulta para mostrar um detalhamento da porcentagem por tipo de dano e executar novamente a consulta.

Veja os resultados. O que significa a percentagem? Observe que a consulta chama a função Pcent , que definimos na let instrução. As entradas usadas nessa função são TotalDamagingEvents e TotalEvents, o que significa que você está procurando a porcentagem de eventos que causaram danos.