Esercizio - Introdurre le variabili usando l'istruzione let

Completato

È stato usato un set di dati meteorologico per aggregare e visualizzare i dati. In questo articolo si apprenderà come usare le istruzioni let per introdurre le variabili e organizzare query complesse.

Le istruzioni let sono utili per suddividere un'espressione complessa in più parti, definendo costanti al di fuori del corpo della query per la leggibilità oppure definendo una variabile una sola volta e usandola più volte all'interno di una query. Possono essere usate le istruzioni let per creare query complesse ben organizzate. È possibile usare più let istruzioni let; ogni istruzione deve essere seguita da un punto e virgola (;).

Possono essere usate le istruzioni let in diversi tipi di situazioni. Nel livello più semplice è possibile definire valori scalari a cui si farà riferimento in un secondo momento in una query, ad esempio int, stringa, data/ora o qualsiasi altro valore. È possibile creare una visualizzazione filtrata tabulare di una tabella che verrà usata come input tabulare per la query. È anche possibile creare una funzione usando un'istruzione let.

Definire un valore scalare con un'istruzione let

Tenere presente che le query precedenti hanno applicato un filtro in base alla posizione o a danni minimi. Definire questi valori limite usando un'istruzione let all'inizio della query.

La query seguente usa due istruzioni let per definire i valori scalari che verranno successivamente usati come parametri di input nella query. Il primo valore definito è un numero e il secondo è una stringa. Le istruzioni let terminano con un punto e virgola.

Si notino le parti commentate della query che iniziano con barre doppie (//). Le barre doppie indicano l'inizio di un commento fino alla fine della riga. Questi commenti sono stati ignorati durante l'esecuzione delle query.

  1. Eseguire la query riportata di seguito:

    Eseguire la query

    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
    

    Dovrebbero essere visualizzati risultati simili all'immagine seguente:

    Screenshot of query using the let statement and its results.

  2. Provare a modificare il nome dello stato o i numeri di danno minimo e a ripetere la query. Come cambiano i risultati?

Convertire un risultato tabulare in un valore scalare usando toscalar all'interno di un'istruzione let

Esaminare successivamente un conteggio del tipo di evento più frequente in funzione del tempo. Prima di tutto, è necessario capire qual è il tipo di evento più frequente. Questo valore verrà quindi usato in una query. Usare la tabella StormEvents per trovare l'oggetto EventType principale contando il numero di eventi all'interno di ogni tipo. Usare l'operatore project per restituire solo la colonna EventType.

Prima di iniziare a costruire l'istruzione let, eseguire la query per scoprire qual è effettivamente l'evento. In questo modo è possibile verificare che la query produca i risultati previsti.

Eseguire la query

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

Dovrebbero essere visualizzati risultati simili all'immagine seguente:

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

Si noterà che la query ha prodotto un risultato tabulare con una colonna e una riga. Tuttavia, si vuole convertire questo valore in un valore scalare da usare come valore di filtro nella query principale. Definire innanzitutto il nome della variabile che si desidera introdurre come MostFrequentEventType. Successivamente, si vuole convertire il risultato tabulare in un valore scalare inserendo l'intera query all'interno della funzione toscalar().

I passaggi precedenti vengono riepilogati nell'istruzione let seguente:

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

Si noti che questa istruzione non è una query valida, perché una query valida deve contenere almeno un'istruzione che non è un'istruzione let. È tuttavia possibile usare questo valore scalare archiviato in una query. Si ricordi che si vuole esaminare l'ora di evento più frequente in funzione del tempo. Si applicherà un filtro in base a MostFrequentEventType, quindi si riepilogherà il numero in base a un determinato bin di tempo.

In questo caso verranno esaminati i risultati per mese. Si userà la funzione startofmonth(), che restituisce un valore di datatime che rappresenta l'inizio del mese per il valore di data specificato. In questa query si userà la colonna StartTime come input per la funzione startofmonth().

Infine, si esegue il rendering dei risultati come grafico a colonne per ottenere un istogramma del numero del tipo di evento più frequente in bin per mese.

  1. Eseguire la query riportata di seguito:

    Eseguire la query

    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
    

    Dovrebbero essere visualizzati risultati simili all'immagine seguente:

    Screenshot of let query using complicated scalar and results.

  2. Provare a modificare la query per visualizzare un istogramma del tipo di evento meno frequente in bin per mese e a eseguire di nuovo la query.

Costruire un'istruzione let con output tabulare

Gli esempi precedenti hanno creato un valore scalare archiviato da usare come parametro di input in una query. Tuttavia, è anche possibile usare un'istruzione let per creare dati tabulari che vengono quindi usati come input per una query.

  1. Filtrare la tabella StormEvents in base agli eventi che indirettamente o direttamente hanno causato morti. Restituire quindi un subset delle colonne usando l'operatore project. Questa istruzione genera un output tabulare denominato KillerStorms. Usare questa istruzione let come input iniziale per la query.

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    
  2. È quindi possibile usare alcune delle funzioni di aggregazione apprese nelle unità precedenti. Eseguire la query riportata di seguito:

    Eseguire la query

    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
    

    Dovrebbero essere visualizzati risultati simili all'immagine seguente:

    Screenshot of tabular let statement and results.

  3. Esaminare i risultati. Tutti gli eventi vengono riepilogati nella colonna DistinctKillerEventTypes denominata "killer storms"?

Creare una funzione definita dall'utente con l'istruzione let

È anche possibile usare istruzioni let per definire funzioni definite dall'utente, che sono sottoquery riutilizzabili. Si supponga di voler capire quale percentuale di ciascun tipo di evento ha causato danni. Si creerà una funzione definita dall'utente che calcola le percentuali e in seguito chiamerà questa funzione e si specificherà quali colonne devono essere usate per calcolare la percentuale.

All'interno di un'istruzione let si dichiarerà il nome della funzione, gli argomenti e il corpo usando la sintassi generale seguente:

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

In particolare, si userà una funzione definita dall'utente per calcolare le percentuali. Definire prima di tutto il tipo di dati e gli argomenti di input. Per questo esempio si useranno gli argomenti seguenti:

Nome dell'argomento Tipo di dati Descrizione
portion real Parte degli eventi totali di cui si vuole calcolare la percentuale.
totale real Numero totale di eventi.

Si arrotonderà la risposta a due posizioni decimali usando la funzione round().

Presa nel complesso, la funzione definita dall'utente descritta dall'istruzione let è:

let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
  1. Usare questa istruzione let nella query seguente:

    Eseguire la query

    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
    

    Dovrebbero essere visualizzati risultati simili all'immagine seguente:

    Screenshot of let statement with results.

  2. Fermarsi un momento per esaminare i risultati. Provare a modificare la query per visualizzare una suddivisione della percentuale in base al tipo di danno e a ripetere la query.

Si osservino i risultati. Che cosa indica la percentuale? Si noti che la query chiama la funzione Pcent, definita nell'istruzione let. Gli input usati in questa funzione sono TotalDamagingEvents e TotalEvents, il che significa che si sta cercando la percentuale di eventi che hanno causato danni.